IndexOf列表太慢了。更快的解决方案?

时间:2009-07-02 17:40:38

标签: c# list performance indexof

我有通用列表,它必须是保留的顺序,所以我可以检索列表中对象的索引。问题是IndexOf太慢了。如果我将IndexOf注释掉,那么代码可以快速运行。有没有更好的方法,例如c#的保留有序哈希列表?

谢谢, 内特

  • 编辑 - 添加/插入项目的顺序是它需要的顺序。不需要对它们进行分类。此列表也有可能经常更新,添加,删除,插入。基本上我需要将对象转换为索引,因为它们在网格控件中表示,因此我可以根据索引对网格控件执行操作。

9 个答案:

答案 0 :(得分:11)

如果它没有排序,但需要保留,那么你可以有一个单独的Dictionary<YourClass, int>,其中包含每个元素的索引。

如果你想要一个排序列表,然后检查以前的帖子 - 你可以在.Net 3.5中使用SortedList<Tkey, TValue>,或者对它进行排序并在较旧的.Net版本中使用BinarySearch。

[编辑]您可以在网上找到类似的例子,例如:OrderedList。这个内部使用ArrayList和HashTable,但您可以轻松地使它成为通用的。

[Edit2] Ooops ..我给你的​​例子并没有像我在开头描述的那样实现IndexOf ...但是你明白了 - 一个列表应该被排序,另一个列表用于快速查找。 / p>

答案 1 :(得分:6)

使用List<T>.Sort对其进行排序,然后使用List<T>.BinarySearch方法:“搜索整个已排序的List(T)元素[...]此方法为O(日志) n)操作,其中n是范围内元素的数量。“

答案 2 :(得分:4)

请参阅this article here的底部。

看起来编写自己的方法来检索索引要比使用IndexOf方法快得多,因为它根据类型调用了虚方法。

这样的事情可能会提高你的表现。我写了一个小的单元测试,以验证这可以提高搜索的性能,并且在包含10,000个项目的列表中确实提高了大约15倍。

static int GetIndex(IList<Item> list, Item value)
{
    for (int index = 0; index < list.Count; index++)
    {
        if (list[index] == value)
        {
             return index;
        } 
    }
    return -1;
}

答案 3 :(得分:3)

也许您正在寻找SortedList<TKey, TValue>

答案 4 :(得分:2)

如果您需要排序的项目,我建议您使用SortedList<TKey, TValue>SortedDictionary<TKey, TValue>类。差异如下。

  
      
  • SortedList<TKey, TValue>使用的内存少于SortedDictionary<TKey, TValue>

  •   
  • SortedDictionary<TKey, TValue>具有更快的插入和删除操作   未排序的数据:O(log n)而不是SortedList<TKey, TValue>的O(n)。

  •   
  • 如果列表是从排序数据中一次性填充的,则SortedList<TKey, TValue>是   快于SortedDictionary<TKey, TValue>

  •   

如果您只想保留排序,可以使用Dictionary<TKey, TValue>并将项目存储为键,将索引存储为值。缺点是重新排序项目,插入或删除是非常昂贵的。

答案 5 :(得分:2)

如果要保留列表中的对象的顺序,那么我能想到你将获得最快访问权限的唯一方法就是告诉对象它的索引是什么position是当它添加到列表中的时候。这样您就可以查询对象以获取列表中的索引。缺点是,在我看来,它的一大缺点是插入的对象现在依赖于列表。

答案 6 :(得分:1)

没有理由你不得不订购哈希列表......这就是重点。但是,哈希列表应该很容易做到。

答案 7 :(得分:1)

如果您使用的是List类,则可以在最初填充后使用Sort方法对其进行排序,然后使用BinarySearch方法查找相应的元素。

答案 8 :(得分:1)

我不确定C#中的细节,但您可以对其进行排序(QuickSort?)然后对其使用二进制搜索(BinarySearch性能为O(log2(N)),而不是Sequential,例如indexOf,即O(n))。 (重要:对于二进制搜索,必须对结构进行排序)

当您向数据结构中插入项目时,您可以尝试修改二进制搜索以查找插入点,或者如果要添加大型组,则应添加它们然后对它们进行排序。

唯一的问题是插入速度会慢一些。