Find()与Where()。FirstOrDefault()
我经常看到有人使用Where.FirstOrDefault()
进行search并获取第一个元素。 为什么不使用Find()
? 对方是否有优势? 我无法区分。
namespace LinqFindVsWhere { class Program { static void Main(string[] args) { List<string> list = new List<string>(); list.AddRange(new string[] { "item1", "item2", "item3", "item4" }); string item2 = list.Find(x => x == "item2"); Console.WriteLine(item2 == null ? "not found" : "found"); string item3 = list.Where(x => x == "item3").FirstOrDefault(); Console.WriteLine(item3 == null ? "not found" : "found"); Console.ReadKey(); } } }
IEnumerable<T>
上的Find
方法在哪里? (修辞问题)
Where
和FirstOrDefault
方法适用于多种序列,包括List<T>
, T[]
, Collection<T>
等。实现IEnumerable<T>
任何序列都可以使用这些方法。 Find
仅适用于List<T>
。 通常更适用的方法则更具可重用性 ,影响更大。
我想我的下一个问题是为什么他们添加了查找。 这是一个很好的提示。 我唯一能想到的是FirstOrDefault可以返回一个不同于null的默认值。 否则,这似乎是一个毫无意义的补充
在List<T>
Find
List<T>
早于其他方法。 List<T>
在.NET 2.0中添加了generics,而Find
则是该类的API的一部分。 Where
和FirstOrDefault
作为IEnumerable<T>
扩展方法添加到Linq(后来的.NET版本)中。 我不能肯定地说,如果Linq在2.0发行版中存在,那么Find
将永远不会被添加,但是对于早期的.NET版本中的许多其他function来说,情况可能已经变得过时,或者由于以后的版本而变得冗余。
我今天刚刚发现,在80K对象列表上做了一些testing,发现Find()
速度比使用FirstOrDefault()
的Where
快了1000%。 我不知道,直到每一个testing之前和之后的计时器。 有时候是同一时间,否则速度会更快。
Find
仅在List<T>
,而Where().FirstOrDefault()
与所有IEnumerable<T>
Where().FirstOrDefault()
工作。
如果数据的来源是entity framework,则有一个非常重要的区别: Find
将find“已添加”状态的实体,但尚未持续,但Where
不会。 这是devise。