List <T> .IndexOf()与List <T> .FindIndex()的效率

use*_*181 10 c# performance list

其中一种方法

  • List<T>.IndexOf()
  • List<T>.FindIndex()

在处理时间方面更有效?

T在这种情况下的类型是String.

Cᴏʀ*_*ᴏʀʏ 16

IndexOf执行for循环,使用Equals被搜索对象的实现来查找匹配项.FindIndex也会执行for循环,但会评估a Predicate来检查匹配.

他们每个都归结为一个for循环.性能差异(如果有的话)可以忽略不计.以下是一些MSDN摘录:

List<T>.IndexOf Method (T):

该方法执行线性搜索; 因此,该方法是O(n)运算,其中nCount.

List<T>.FindIndex Method (Predicate<T>):

该方法执行线性搜索; 因此,该方法是O(n)运算,其中nCount.

也就是说,这两个功能的用法完全不同.前者假设您有一个列表中的对象,您只需知道列表中存在的索引(如果有).

后者假设您了解某个对象的某些条件,并且您希望找到列表中的对象与该条件匹配的第一个索引.可能有多个匹配项,但该方法返回第一个匹配项.


Den*_*901 6

C???建议性能差异可以忽略不计,如果有的话。因为我的直觉是使用委托总是会变慢,所以我决定对其进行测试。

使用 DotNetBenchMark 和以下代码进行测试:

[MemoryDiagnoser]
public class Bench
{
    byte[] buffer;

    public Bench()
    {
        buffer = new byte[1024];
    }

    [Benchmark]
    public void FindIndex()
    {
        int index = Array.FindIndex(buffer, x => x == byte.MaxValue);
    }

    [Benchmark]
    public void IndexOf()
    {
        int index = Array.IndexOf(buffer, byte.MaxValue);
    }
}
Run Code Online (Sandbox Code Playgroud)
  • FindIndex 的平均运行时间为 1,986.2 ns
  • IndexOf 的平均运行时间为 178.4 ns

性能差异似乎不可忽略,因为它慢了 10 倍以上。

即使在数组的第 16 个元素匹配的情况下,IndexOf 仍然是 FindIndex 的两倍多

  • 感谢您对我的回答的分析和审阅。我很乐意修改它。 (2认同)