任何人都可以告诉我以下两个lambda表达式之间的区别:
1. TabView mytab = TabCollection.Where(s => s.TabHeader == h).FirstOrDefault();
2. TabView mytab = TabCollection.FirstOrDefault(s => s.TabHeader == h);
TabCollection是TabView类型的ObservableCollection。
答案 0 :(得分:5)
这两个陈述将提供相同的结果。
区别在于如何实现结果。第二个是稍微更高效,因为它不需要为Where
方法生成迭代器,然后获取它的枚举器,而是可以直接枚举集合直到找到匹配项。
答案 1 :(得分:3)
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);
所以,第二种选择稍微有点效率。