我提供的开源项目(OSP)代码中有多个位置,必须确定集合中的元素是否满足某个条件.
我已经看到Any(lambda expression)
在某些情况下和FirstOrDefault(lambda expression) != null
其他情况下使用LINQ表达式,但从未考虑过它.
我现在已达到这样的程度,我必须对从查询到数据库的集合进行一些迭代,并希望优化运行时.
所以我认为FirstOrDefault(lambda expression) != null
应该比这更快Any(lambda expression)
,对吧?
在这种情况下FirstOrDefault(lambda expression) != null
,迭代(可能)在找到满足条件的元素时停止(更糟糕的情况是它遍历整个集合并返回null
).
在Any(lambda expression)
我想象的情况下,即使找到满足条件的元素,迭代也会继续到集合的末尾.
编辑:以上情况并非如杰克逊教皇提到并链接相关的MSDN文章.
我的想法是正确的还是我错过了什么?
Dan*_*rth 48
你在这里混合东西.您正在谈论集合,但您似乎没有使用LINQ到对象,但您正在查询数据库.
LINQ to objects:
Enumerable.Any
并且Enumerable.FirstOrDefault
应该执行相同的操作,因为它们的代码几乎相同:
FirstOrDefault
:
foreach (TSource source1 in source)
{
if (predicate(source1))
return source1;
}
return default (TSource);
Run Code Online (Sandbox Code Playgroud)
Any
:
foreach (TSource source1 in source)
{
if (predicate(source1))
return true
}
return false;
Run Code Online (Sandbox Code Playgroud)
LINQ到一些数据库:
您正在使用Entity Framework,LINQ to SQL或NHibernate并使用Queryable.Any
和Queryable.FirstOrDefault
对应的数据上下文.
在这种情况下,实际上没有集合,因为这些调用不会在内存对象中执行,而是转换为SQL.
这意味着,性能差异源于LINQ提供程序如何将代码转换为SQL,因此最好先检查创建的语句.它们是等价的吗?或者他们是非常不同(select count(0) from X
对比select top 1 from X
)?那么差异可能在于DB的查询优化器,索引以及什么不...
Jac*_*ope 45
Any()
一旦找到匹配项,枚举就会停止:
http://msdn.microsoft.com/en-us/library/bb534972.aspx
我希望性能非常相似.请注意,该FirstOrDefault
版本不适用于值类型的集合(因为默认值不为null),但Any
版本会.
小智 10
这个问题的问题在于它不是在上下文中询问的.我提供了一个答案,因为我在代码审查中看到了很多,这让我很烦恼.LINQ不应该成为停止思考的借口.
var people = new [] { "Steve", "Joe" };
if (people.Any(s => s == "Joe"))
{
var joe = people.First(s => s == "Joe");
// do something with joe
}
// if people is 1,000,000 people and joe is near the end do we want BigO to approach 2N here at worst case ?
var joe1N = people.FirstOrDefault(s => s == "Joe");
if (joe1N != null)
{
// do something with joe
}
// or do we want to ensure worst case is N by simply using a variable ?
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
30155 次 |
最近记录: |