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

本文关键字:之间 表达式 Lambda 代码 两个 | 更新日期: 2023-09-27 18:22:23

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

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

TabCollection是TabView类型的ObservableCollection。

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

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

不同之处在于结果是如何实现的。第二个是稍微更高效,因为它不需要为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);

第二个不创建迭代器——它只是在源上枚举:

TabCollection.FirstOrDefault(s => s.TabHeader == h);

与相同

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

所以,第二种选择稍微更有效率。