关于c#:System.Collections.Generic.Find()vs Linq.First()

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

有人能告诉我何时使用find()和何时使用first()吗?如果您只想通过简单的查询在列表中查找特定的项,那么这一项比另一项好吗?


如果列表类型的默认值(即,对于引用类型为空,对于数值类型为零,对于其他值类型调用默认构造函数的结果)可能是正确的"找到它"结果,并且如果将其与未找到的结果区分开来很重要,则需要使用First(),因为它将当Find()将返回默认值时,我抛出一个没有发现任何东西的异常。

所以。在这种情况下,是否需要例外?

抛开这一区别,Find()FirstOrDefault()基本相同,后者在没有发现任何情况时也会返回默认值。

在.net2.0中使用Find(),因为您没有FirstOrDefault()

如果只需要添加一个对System.Core的引用,那么使用Find(),尽管这不是一个大问题(不像System.Core不是所有框架版本都常用和可用的)。

如果你想用除List以外的东西来调用它,就使用FirstOrDefault()。如果将来你想用除L
ist
以外的东西来称呼它,可以使用FirstOrDefault()

如果您真的关心细微的性能差异,那么就使用Find(),但是如果您真的关心细微的性能差异,那么最好编写自己的方法,该方法贯穿列表,并且无论如何都不使用委托。

如果谓词是item => true,则使用FirstOrDefault(),因为可以调用不带谓词的窗体。也就是说,你可以使用list[0]

如果您将FirstOrDefault()与其他LINQ混合,则使用它,因为这样读起来会更加一致。

不过,上述任何一项都不完全是天壤之别。实际上,这两者之间的差别很小,如果在同一个框架版本中添加FirstOrDefault(),我怀疑Find()是否会被编写。


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

一些很酷的SO线程:

  • Linq:何时使用带有筛选条件的singleOrDefault与firstOrDefault()。
  • 关于FirstOrDefault或SingleOrDefault

  • 它们基本上做相同的事情,除了第一个()在匹配不存在的情况下引发异常。first或default与find()基本匹配。

    对于感兴趣的人,first()和find()的工作方式略有不同。

    这是从list中提取的find()中的(近似)find循环。它使用数组索引。

    1
    2
    3
    4
    5
    6
    7
    8
        int num = 0;
        num++;
        while (num < this._size)
            if (match(this._items[num]))
                return this._items[num];
        T t = default(T);

        return t;

    first()使用枚举,因此可用于任何可枚举集合

    1
    2
    3
    4
    5
        foreach (TSource tSource in source)
            if (predicate(tSource))
                return tSource;

        throw Error.NoMatch();

    这应该允许find()由于没有枚举器开销而具有轻微的速度优势。


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