System.Collections.Generic.Find() vs Linq.First()
有人能告诉我何时使用find()和何时使用first()吗?如果您只想通过简单的查询在列表中查找特定的项,那么这一项比另一项好吗?
- 你是说System.Collections.Generic.List.Find()吗?
如果列表类型的默认值(即,对于引用类型为空,对于数值类型为零,对于其他值类型调用默认构造函数的结果)可能是正确的"找到它"结果,并且如果将其与未找到的结果区分开来很重要,则需要使用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
- 所以问题应该是Find对FirstOrDefault。
- 修改后的答案,包括有关查找与FirstOrDefault的注释
- @丹尼尔希尔加思-你想更新你的帖子还是我的。布迪,你更新了我的帖子。
- @AVD很抱歉是我更新了你的帖子,不是丹尼尔。这是偶然的,正如你所说,我打算更新我的帖子。
它们基本上做相同的事情,除了第一个()在匹配不存在的情况下引发异常。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()由于没有枚举器开销而具有轻微的速度优势。
- 当然,你的意思是"这应该让Find()有一点速度优势"?
- 是的,那里的校对很草率,更新到正确的。
- 我总是这么做。或者我要么加上要么省略一个"不",最后说的和我的意思相反。
- @乔阿希米萨克森,接球不错!我做了一些测试,发现速度真的很快,而且不是很轻微,有一个坚实的区别。查找速度几乎是原来的两倍。请看这里
First()返回序列中的第一个元素,如果源序列为空或找不到匹配项,则引发异常。Find()方法搜索与条件匹配的元素,如果未找到匹配项,则返回类型的默认值。
- 所以问题应该是Find对FirstOrDefault。