我有一个通用列表,必须保留其顺序,以便我可以检索列表中对象的索引。问题是IndexOf方法太慢了。如果我注释掉IndexOf方法,代码运行速度就会非常快。是否有更好的方法,比如C#中的保留有序哈希列表?
谢谢, Nate
- 编辑 - 添加/插入项目的顺序就是它需要的顺序。不需要对它们进行排序。此外,这个列表可能经常更新,添加、删除、插入。基本上,由于它们在网格控件中表示,我需要将对象转换为索引,以便可以根据索引在网格控件上执行操作。
我有一个通用列表,必须保留其顺序,以便我可以检索列表中对象的索引。问题是IndexOf方法太慢了。如果我注释掉IndexOf方法,代码运行速度就会非常快。是否有更好的方法,比如C#中的保留有序哈希列表?
谢谢, Nate
Dictionary<YourClass, int>
,其中包含每个元素的索引。SortedList<Tkey, TValue>
,或对其进行排序并在旧版 .Net 中使用BinarySearch。List<T>.Sort
进行排序,然后使用 List<T>.BinarySearch
方法进行查找:“在整个已排序的 List(T)
中搜索元素[...] 此方法是 O(log n) 操作,其中 n 是范围内元素的数量。”static int GetIndex(IList<Item> list, Item value)
{
for (int index = 0; index < list.Count; index++)
{
if (list[index] == value)
{
return index;
}
}
return -1;
}
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>
,将项目存储为键,将索引存储为值。缺点是重新排序项目、插入或删除相当昂贵。好吧,你永远不应该需要订购散列列表......这就是重点。然而,散列列表应该非常容易解决问题。
我不确定C#中的具体情况,但您可能可以对其进行排序(快速排序?),然后在其中使用二分查找(二分查找性能为O(log2(N)),而顺序查找,如indexOf,则为O(n))。 (重要提示:对于二分查找,您的结构必须经过排序)
当您向数据结构插入项目时,您可以尝试使用修改后的二分查找来查找插入点,或者如果您正在添加大量项目,则会将它们添加并对其进行排序。
唯一的问题是插入速度会变慢。