我在想,SortedList
是如何运作的。
我知道常规List
基于动态数组,但基于SortedList
是什么?
它使用什么排序算法?
由于
答案 0 :(得分:2)
从sortedlist文档中:“SortedList实现为键/值对的数组,按键排序。”
http://msdn.microsoft.com/en-us/library/e7a8xew6%28v=vs.110%29.aspx
如果使用默认构造函数(无参数):“初始化SortedList类的新实例,该实例为空,具有默认初始容量,并根据添加到SortedList对象的每个键实现的IComparable接口进行排序“
http://msdn.microsoft.com/en-us/library/cxb97few%28v=vs.110%29.aspx
或者您可以传递自定义比较器:
初始化SortedList类的新实例,该实例为空,具有默认初始容量,并根据指定的IComparer接口进行排序。 http://msdn.microsoft.com/en-us/library/e7a8xew6%28v=vs.110%29.aspx
其他构造函数选项: http://msdn.microsoft.com/en-us/library/System.Collections.SortedList.SortedList%28v=vs.110%29.aspx
如何使用IComparer接口:http://msdn.microsoft.com/en-us/library/system.collections.icomparer%28v=vs.110%29.aspx
答案 1 :(得分:1)
SortedList
类源代码here。
根据此消息来源,SortedList
将数据保存在两个简单的键和值数组中:
private TKey[] keys;
private TValue[] values;
在键阵列上维护排序顺序。添加新项目(键/值对)后,SortedList
首先在排序的键数组中找到正确的索引(使用Array.BinarySearch
),然后移动的部分内容键和值数组(使用Array.Copy
)从此索引向上开始,以创建插入键和值的间隙。同样,当一个项目被其键删除时,SortedList
在键数组中搜索项目的索引,然后向下移动这个索引的部分内容以缩小差距。
因此,要记住的一件事是,在添加或删除大SortedList
时,可能会移动大量数据。从积极的方面来说,无论列表大小如何,按索引检索项目总是很快。
答案 2 :(得分:0)
如果你对它的工作原理感兴趣,可以给自己任何一个不错的反编译器,比如.Net Reflector。
快速查看显示,在内部,SortedList通过始终对内部数组进行排序来维护其排序状态。使用“添加方法”添加项目时,它会使用键上的二进制搜索来标识插入新项目的正确索引。
答案 3 :(得分:0)
SortedList
是一个维护两个数组的对象,用于存储列表的元素。
一个数组商店是Key
,另一个数组商店是关联的values
。
SortedList中的元素根据创建SortedList时指定的特定IComparer实现或根据键本身提供的IComparable实现进行排序。它们不能包含重复的密钥。
每当添加或删除任何元素时,索引都会相应调整,因此与SortedList
相关的操作会变慢。