LINQ Any vs FirstOrDefault的性能!= null

Jim*_*imi 39 c# linq

我提供的开源项目(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.AnyQueryable.FirstOrDefault对应的数据上下文.
在这种情况下,实际上没有集合,因为这些调用不会在内存对象中执行,而是转换为SQL.

这意味着,性能差异源于LINQ提供程序如何将代码转换为SQL,因此最好先检查创建的语句.它们是等价的吗?或者他们是非常不同(select count(0) from X对比select top 1 from X)?那么差异可能在于DB的查询优化器,索引以及什么不...

  • 'FirstOrDefault' 必须从对象返回实际数据,因此如果索引较小,则 'Any' 调用 _should_ 有可能更快。特别是在有很多列的宽表中。 (2认同)

Jac*_*ope 45

Any()一旦找到匹配项,枚举就会停止:

http://msdn.microsoft.com/en-us/library/bb534972.aspx

我希望性能非常相似.请注意,该FirstOrDefault版本不适用于值类型的集合(因为默认值不为null),但Any版本会.

  • 当你想知道是否存在满足指定条件的东西时,使用`Any()`是一种情况,但如果你真的想要那个对象,那么`FirstorDefault()` (13认同)

小智 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)

  • 这不是问题的答案......因为我迟到了:我真的不知道你想告诉我们什么。在这种情况下,我们应该使用“FirstOrDefault”还是应该使用“Any”+“First”?我不明白重点。你(或其他人)能解释一下吗? (2认同)