C# 以下两个代码段之间的差异(Lambda表达式)

C# 以下两个代码段之间的差异(Lambda表达式),c#,lambda,C#,Lambda,有人能告诉我以下两个lambda表达式之间的区别吗: 1. TabView mytab = TabCollection.Where(s => s.TabHeader == h).FirstOrDefault(); 2. TabView mytab = TabCollection.FirstOrDefault(s => s.TabHeader == h); TabCollection是TabView类型的ObservableCollection。这两条语句将提供相同

有人能告诉我以下两个lambda表达式之间的区别吗:

    1. TabView mytab = TabCollection.Where(s => s.TabHeader == h).FirstOrDefault();

    2. TabView mytab = TabCollection.FirstOrDefault(s => s.TabHeader == h);

TabCollection是TabView类型的ObservableCollection。

这两条语句将提供相同的结果

区别在于如何取得结果。第二种方法的效率稍高一些,因为它不需要为
Where
方法生成迭代器,然后获取它的枚举器,而是可以直接枚举集合,直到找到匹配项为止

TabCollection.Where(s => s.TabHeader == h).FirstOrDefault()
这将创建
WhereIterator
并返回它。然后开始迭代并返回它的第一个元素。看起来像

var iterator = new WhereEnumerableIterator<TSource>(TabCollection, predicate);

using (IEnumerator<TSource> enumerator = iterator.GetEnumerator())
{
   if (enumerator.MoveNext())
       return enumerator.Current;
}

return default(TSource);

foreach (TSource local in TabCollection)
{
    if (predicate(local))        
        return local;        
}

return default(TSource);

因此,第二个选项的效率略高。

我看不出有什么不同。
代码更少+结果相同
=
代码更好
。使用第二种方法。少打字。延迟腕管。当你分开两种方法时,你有更多的选择。您可以懒洋洋地使用
Where
查询,因此在每次迭代或方法调用中,它可能会产生不同的结果。如果需要,您还可以链接其他linq方法(例如,
OrderBy
Take(n)
),而
FirstOrDefault
“结束”查询。然而,第二种方法更有效,更重要的是,更具可读性,因为它更直接slight@LukeMcGregor有一个额外的迭代器被分配用于处理Where枚举——它是次要的,但在一个紧循环或性能代码中,避免分配可能很重要。不过,除了紧密循环之外,很难在任何情况下进行测量,因为任何增益都可能比节省的CPU周期更能降低GC压力。@ReedCopsey-GC压力的优点:)空间复杂性经常被忽略。@TravisJ这完全不正确。Where()方法返回迭代器,而不是完全填充的集合。当
FirstOrDefault
开始枚举从
Where
返回的
IEnumerable
时,它以延迟的流式方式枚举它。一旦找到匹配项,两个版本仍将短路并停止检查。@TravisJ Yes-返回的第一个成品(从第一个或默认值)将“停止”Where迭代器继续<代码>其中不需要检查每个项目-它只会在FirstOrDefault枚举项目时检查项目,这意味着它只会检查直到找到匹配项,然后停止。
foreach (TSource local in TabCollection)
{
    if (predicate(local))        
        return local;        
}

return default(TSource);