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方法在哪里? (修辞问题)

WhereFirstOrDefault方法适用于多种序列,包括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的一部分。 WhereFirstOrDefault作为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。