在Find,Single,First中,哪一个最快?

我想最小化从列表中检索单个唯一元素所需的时间。 哪一个是FindSingleFirst最快的方法? 请注意,搜索键是唯一的ID。

最快的 (对于大型集合)将使它们与Dictionary键入并使用它。

SingleFirst做不同的事情; Single总是迭代整个集合,即使它在列表的开头找到它,所以First通常比Single短,因为它短路。

First会比Single更快,因为它可以在找到匹配后立即终止。 另一方面,这意味着它不会validation只有一个项与谓词匹配。

Find应该与First一样快,但不太便于携带,因为它只能在列表上运行。 如果您一般使用LINQ,我会尝试坚持LINQ运算符,除非使用替代方案有明确的好处。

正如Marc所说,如果你要经常这样做,你应该使用Dictionary<,> 。 您可以使用ToDictionary运算符轻松完成此操作:

 var dictionary = list.ToDictionary(x => x.Id); // Now you can look up by ID really quickly 

显然创建字典需要一些时间才能开始,所以如果你多次搜索,你只想这样做。

它们是不同的方法。 FindList定义,它与Enumerable.cs定义的First几乎相同,作为IEnumerable上的扩展方法。 如果找到一个条件项(它们不需要遍历整个集合),它们都将返回,因此它们具有轻微的性能差异。

Single返回条件项,并且还保证此项是唯一满足条件的项。 所以在大多数情况下, SingleFirst / Find慢,因为它需要遍历集合。

作为现有答案的补充:List.Find比IEnumerable.First快得多,因为第一个可以在List的内部数组上运行。 后者必须通过IList接口。