System.Collections.Generic.Find() vs Linq.First()
本文关键字:Linq First vs Collections Find System Generic | 更新日期: 2023-09-27 18:20:02
谁能告诉我什么时候使用 Find(( 以及什么时候使用 First(( ?如果您只想通过简单的查询来查找列表中的特定项目,那么一个是否比另一个更好?
如果列表类型的默认值(即,引用类型为 null,数值类型为 null,对于其他值类型调用默认构造函数的结果(可能是正确的"找到它"结果,并且如果您将其与未找到它区分开来很重要,那么您需要使用 First()
,因为它会在找不到任何内容时引发异常, 而Find()
将返回默认值。
所以。在这种情况下,您是否想要例外?
撇开这种区别不谈,Find()
与 FirstOrDefault()
几乎相同,后者在未找到任何内容时也会返回默认值。
在 中使用Find()
。NET2.0,因为你没有FirstOrDefault()
.
如果这是您唯一要添加对System.Core
的引用的内容,请使用 Find()
,尽管这不是一个大问题(它不像 System.Core
不常用并且可用于所有框架版本(。
如果要在List<T>
以外的其他设备上调用它,请使用FirstOrDefault()
。如果将来可能想在L
ist<T>
以外的其他设备上调用它,请使用 FirstOrDefault()
。
如果您真的关心微不足道的性能差异,请使用Find()
,但如果您这样做,最好编写自己的方法,该方法在列表中旋转并且无论如何都不使用委托。
如果您的谓词是item => true
,请使用 FirstOrDefault()
,因为您可以调用不带谓词的形式。也就是说,您仍然可以使用list[0]
。
如果要将其与其他 Linq 混合使用,请使用 FirstOrDefault()
,因为这样阅读会更加一致。
不过,以上都不是惊天动地的差异。真的,两者之间的差异很小,我怀疑如果FirstOrDefault()
添加到同一个框架版本中,Find()
会被写出来。
First()
返回序列中的第一个元素或满足条件的序列中的第一个元素。该方法First()
序列为空时引发异常。 Find()
方法搜索与条件匹配的元素。如果未找到搜索元素,则返回类型 T
的默认值。
一些很酷的SO线程:
- LINQ:何时使用具有筛选条件的 SingleOrDefault 与 FirstOrDefault(( 关于"第一个或默认"或
- "单个或默认">
First()
返回序列中的第一个元素,如果源序列为空或找不到匹配项,则会引发异常。 Find()
方法搜索与条件匹配的元素,如果未找到匹配项,则返回该类型的默认值。
它们基本上做同样的事情,除了 First(( 在匹配不存在时抛出异常。FirstOrDefault几乎是Find((的匹配。
对于任何感兴趣的人,First(( 和 Find(( 的工作方式略有不同。
这是从 List
int num = 0;
num++;
while (num < this._size)
if (match(this._items[num]))
return this._items[num];
T t = default(T);
return t;
First(( 使用枚举,因此适用于任何可枚举的集合
foreach (TSource tSource in source)
if (predicate(tSource))
return tSource;
throw Error.NoMatch();
这应该允许 Find(( 由于没有枚举器开销而具有轻微的速度优势。