System.Collections.Generic.Find() vs Linq.First()

本文关键字:Linq First vs Collections Find System Generic | 更新日期: 2023-09-27 18:20:02

谁能告诉我什么时候使用 Find(( 以及什么时候使用 First(( ?如果您只想通过简单的查询来查找列表中的特定项目,那么一个是否比另一个更好?

System.Collections.Generic.Find() vs Linq.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线程:

  1. LINQ:何时使用具有筛选条件的 SingleOrDefault 与 FirstOrDefault((
  2. 关于"第一个或默认"或
  3. "单个或默认">

First()返回序列中的第一个元素,如果源序列为空或找不到匹配项,则会引发异常。 Find()方法搜索与条件匹配的元素,如果未找到匹配项,则返回该类型的默认值。

它们基本上做同样的事情,除了 First(( 在匹配不存在时抛出异常。FirstOrDefault几乎是Find((的匹配。

对于任何感兴趣的人,First(( 和 Find(( 的工作方式略有不同。

这是从 List 中提取的 Find(( 中的(近似(查找循环。它使用数组索引。

    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(( 由于没有枚举器开销而具有轻微的速度优势。