如何在C#中实现List <T> .IndexOf()?

Fra*_*ank 28 .net c# performance list

我正在考虑打电话的表现List<T>.Indexof(item).我不确定它对于顺序算法的O(n)性能还是二叉树的O(log(n))性能?

aba*_*hev 32

使用Reflector for .NET,我们可以看到:

public int IndexOf(T item)
{
    return Array.IndexOf<T>(this._items, item, 0, this._size);
}

public static int IndexOf<T>(T[] array, T value, int startIndex, int count)
{
    return EqualityComparer<T>.Default.IndexOf(array, value, startIndex, count);
}

internal virtual int IndexOf(T[] array, T value, int startIndex, int count)
{
    int num = startIndex + count;
    for (int i = startIndex; i < num; i++)
    {
        if (this.Equals(array[i], value))
            return i;
    }
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

  • @Ken Bloom:MSDN文章有时非常好,有时候很糟糕.因此,如果您对特定方法的实现有疑问,我认为最好的方法 - 去看看它是如何实现的. (27认同)
  • 当有详细的文档时,不要查看代码.有时代码只是一个实现细节,并没有保证. (6认同)
  • 当代码和评论不一致时,两者都可能是错误的. (6认同)

IVl*_*lad 32

这是O(n)根据MSDN.

该方法执行线性搜索; 因此,该方法是O(n)操作,其中n是Count.


JSB*_*ոգչ 14

List<T>由扁平数组支持,list.IndexOf(item)O(n)也是如此.


C. *_* 76 7

List<T>.IndexOf 是O(n),实际上对于无序的n个元素集是最优的.

List<T>.BinarySearch 是O(log n)但只有在排序List时才能正常工作.