在什么情况下每个解决方案优先于另一个?
例1:
if (personList.Any(x => x.Name == "Fox Mulder"))
{
this.Person = personList.Single(x => x.Name == "Fox Mulder");
}
Run Code Online (Sandbox Code Playgroud)
例2:
var mulder = personList.SingleOrDefault(x => x.Name == "Fox Mulder");
if (mulder != null)
{
this.Person = mulder;
}
Run Code Online (Sandbox Code Playgroud)
both Single和SingleOrDefault将枚举超出第一个匹配结果的集合,以验证是否只有一个元素符合条件,停止在下一个匹配或集合的结尾.第一个示例稍微慢一些,因为Any调用将枚举足够的集合(可能是所有集合)以确定是否有任何元素符合条件,停止在集合的第一个匹配或结束.
还有另外一个关键区别:第一个例子可能会抛出异常.如果只有一个Single匹配元素将返回匹配元素,否则抛出异常.检查不验证这一点; 它只验证至少有一个.Any
基于这两个原因(主要/特别是第二个原因),这种SingleOrDefault方法在这里是优选的.
所以,这里有三种情况.
案例1:没有项目符合条件
选项1:.Any枚举整个集合并返回false; .Single从不执行.
选项2:.SingleOrDefault枚举整个集合并返回null.
选项基本相同.
案例2:恰好一个项目符合条件
选项1:Any枚举足够的集合来查找单个匹配(可能是第一个项目,可能是整个集合).接下来,Single枚举整个集合以查找该项目并确认其他项目与其他项目不匹配.
选项2:SingleOrDefault枚举整个集合,返回唯一匹配.
在这种情况下,选项2更好(恰好一次迭代,与(1,2)次迭代相比)
案例3:多个元素符合条件
选项1:Any枚举足以找到第一场比赛.Single枚举足以找到第二个匹配,抛出异常.
选项2:SingleOrDefault枚举足以找到第二个匹配,抛出异常.
两者都抛出异常,但选项2更快地到达那里.
| 归档时间: |
|
| 查看次数: |
3182 次 |
| 最近记录: |