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; }
总是先写一个规范,即使它只是一个句子.