Nas*_*ggy 10 c# performance list indexof
我有通用列表,它必须是保留的顺序,所以我可以检索列表中对象的索引.问题是IndexOf太慢了.如果我将IndexOf注释掉,那么代码可以快速运行.有没有更好的方法,比如c#的保留有序哈希列表?
谢谢,Nate
Gro*_*roo 11
如果它没有排序,但是需要保留顺序,那么你可以有一个单独的Dictionary<YourClass, int>,它包含每个元素的索引.
如果你想要一个排序列表,然后检查以前的帖子 - 你可以SortedList<Tkey, TValue>在.Net 3.5中使用,或者对它进行排序并在较旧的.Net版本中使用BinarySearch.
[编辑]您可以在网上找到类似的例子,例如:OrderedList.这个内部使用ArrayList和HashTable,但您可以轻松地使它通用.
[Edit2] Ooops ..我给你的例子并没有像我在开头描述的那样实现IndexOf ...但是你明白了 - 一个列表应该被排序,另一个列表用于快速查找.
使用它进行排序List<T>.Sort,然后使用List<T>.BinarySearch方法:"搜索整个已排序List(T)的元素[...]此方法是一个O(log n)操作,其中n是范围内元素的数量."
请在此处查看本文底部。
编写自己的方法来检索索引似乎比使用 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;
}
Run Code Online (Sandbox Code Playgroud)