c# – 对FirstOrDefault的不同选择
发布时间:2020-12-15 03:59:42 所属栏目:百科 来源:网络整理
导读:IEnumerable扩展方法FirstOrDefault没有完全按照我想要的方式创建FirstOrValue.这是一个很好的办法吗?还是有更好的方法? public static T FirstOrValueT(this IEnumerableT source,FuncT,bool predicate,T value){ T first = source.FirstOrDefault(predic
IEnumerable扩展方法FirstOrDefault没有完全按照我想要的方式创建FirstOrValue.这是一个很好的办法吗?还是有更好的方法?
public static T FirstOrValue<T>(this IEnumerable<T> source,Func<T,bool> predicate,T value) { T first = source.FirstOrDefault(predicate); return Equals(first,default(T)) ? value : first; } 解决方法
你的代码可能不正确你可能没有考虑所有的情况.
当然,我们不知道任何代码是否正确或不正确,直到我们有规范.所以首先写一条一行规格: “FirstOrValue< T>采用T的序列,谓词和T的值,并返回与谓词匹配的序列中的第一项,如果有的话,或者如果没有,则返回所述值. 您的尝试是否实际实施该规范?当然不是!测试: int x = FirstOrValue<int>( new[] { -2,1 },y=>y*y==y,-1); 这返回-1.根据规范的正确答案为0.与谓词匹配的第一项为零,因此应返回. 规范的正确实现将如下所示: public static T FirstOrValue<T>(this IEnumerable<T> sequence,T value) { if (sequence == null) throw new ArgumentNullException("sequence"); if (predicate == null) throw new ArgumentNullException("predicate"); foreach(T item in sequence) if (predicate(item)) return item; return value; } 总是先写一个规范,即使它只是一个句子. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |