加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读