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

c# – LINQ Any()和Single()与SingleOrDefault()的空检查

发布时间:2020-12-15 08:15:23 所属栏目:百科 来源:网络整理
导读:在什么情况下每个解决方案优先于另一个? 例1: if (personList.Any(x = x.Name == "Fox Mulder")){ this.Person = personList.Single(x = x.Name == "Fox Mulder");} 例2: var mulder = personList.SingleOrDefault(x = x.Name == "Fox Mulder");if (mulde
在什么情况下每个解决方案优先于另一个?

例1:

if (personList.Any(x => x.Name == "Fox Mulder"))
{
  this.Person = personList.Single(x => x.Name == "Fox Mulder");
}

例2:

var mulder = personList.SingleOrDefault(x => x.Name == "Fox Mulder");

if (mulder != null)
{
  this.Person = mulder;
}

解决方法

Single和SingleOrDefault都将枚举超出第一个匹配结果的集合,以验证是否只有一个元素符合条件,停止在下一个匹配或集合结束.第一个示例稍微慢一些,因为Any调用将枚举足够的集合(可能是所有集合)以确定是否有任何元素符合条件,在集合的第一个匹配或结束时停止.

还有另外一个关键区别:第一个例子可能会抛出异常.如果只有一个匹配元素,则返回匹配元素,否则抛出异常.使用Any进行检查不会验证这一点;它只验证至少有一个.

基于这两个原因(主要/特别是第二个原因),SingleOrDefault方法在这里是优选的.

所以,这里有三种情况.

案例1:没有项目符合条件

选项1:.Any枚举整个集合并返回false; .Single永远不会执行.

选项2:.SingleOrDefault枚举整个集合并返回null.

选项基本相同.

案例2:恰好一个项目符合条件

选项1:任何枚举足够的集合来查找单个匹配(可能是第一个项目,可能是整个集合).接下来,Single枚举整个集合以查找该项目并确认其他项目与其他项目不匹配.

选项2:SingleOrDefault枚举整个集合,返回唯一匹配.

在这种情况下,选项2更好(恰好一次迭代,与(1,2)次迭代相比)

案例3:多个元素符合条件

选项1:任何枚举足以找到第一场比赛.单枚举足以查找第二个匹配,抛出异常.

选项2:SingleOrDefault枚举足以查找第二个匹配,抛出异常.

两者都抛出异常,但选项2更快地到达那里.

(编辑:李大同)

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

    推荐文章
      热点阅读