C# · 12月 26, 2021

c# – 对FirstOrDefault的不同选择

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;}

总是先写一个规范,即使它只是一个句子.