我经常看到人们Where.FirstOrDefault()用来进行搜索并抓住第一个元素。为什么不直接使用Find()?对方有优势吗?我说不出有什么不同。
Where.FirstOrDefault()
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(); } } }
Find方法在哪里IEnumerable<T>?(反问。)
Find
IEnumerable<T>
和方法适用于多种序列,包括Where、、等。任何实现的序列都可以使用这些方法。仅适用于. 通常更适用的方法,然后更 可重用 并产生更大的影响。FirstOrDefault``List<T>``T[]``Collection<T>``IEnumerable<T>``Find``List<T> __
Where
FirstOrDefault``List<T>``T[]``Collection<T>``IEnumerable<T>``Find``List<T>
我想我的下一个问题是他们为什么要添加这个发现。这是一个很好的提示。我唯一能想到的是 FirstOrDefault 可以返回除 null 之外的其他默认值。否则,这似乎是一个毫无意义的补充
FindonList<T>早于其他方法。List<T>在 .NET 2.0 中添加了泛型,并且Find是该类 API 的一部分。Where并被FirstOrDefault添加为IEnumerable<T>Linq 的扩展方法,这是一个更高的 .NET 版本。我不能肯定地说,如果 Linq 与 2.0 版本一起存在,那Find将永远不会被添加,但是对于早期 .NET 版本中的许多其他功能,这些功能可能会被后来的版本过时或冗余。
List<T>
FirstOrDefault