C#SortedList内部如何工作?

时间:2013-11-26 04:42:18

标签: c# list sortedlist

我在想,SortedList是如何运作的。 我知道常规List基于动态数组,但基于SortedList是什么?

它使用什么排序算法?

由于

4 个答案:

答案 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相关的操作会变慢。