SortedList和SortedDictionary有什么区别?

SortedList<TKey,TValue>SortedDictionary<TKey,TValue>之间是否有实际的区别? 有什么情况下你会专门使用一个而不是另一个?

是的 – 他们的performance特征差别很大。 把它们称为SortedListSortedTree可能更好一些,因为它更接近地反映了实现。

查看他们每个人( SortedListSortedDictionary )的MSDN文档,了解不同情况下不同操作的性能细节。 这里有一个很好的总结(来自SortedDictionary文档):

SortedDictionary<TKey, TValue>generics类是一个O(log n)检索的二叉search树,其中n是字典中元素的数量。 在这里,它与SortedList<TKey, TValue>generics类相似。 这两个类有相似的对象模型,都有O(log n)检索。 这两个类别在内存使用和插入和删除速度方面存在差异:

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

  • SortedDictionary<TKey, TValue>对未sorting的数据有更快的插入和删除操作,O(log n)与SortedList<TKey, TValue> O(n)相对。

  • 如果列表从已sorting的数据一次全部填充,则SortedList<TKey, TValue>SortedDictionary<TKey, TValue>快。

SortedList实际上维护一个有序数组,而不是使用树,它仍然使用二进制search来查找元素。)

这是一个表格视图,如果它有帮助…

性能angular度来看:

 +------------------+---------+----------+--------+----------+----------+---------+ | Collection | Indexed | Keyed | Value | Addition | Removal | Memory | | | lookup | lookup | lookup | | | | +------------------+---------+----------+--------+----------+----------+---------+ | SortedList | O(1) | O(log n) | O(n) | O(n)* | O(n) | Lesser | | SortedDictionary | n/a | O(log n) | O(n) | O(log n) | O(log n) | Greater | +------------------+---------+----------+--------+----------+----------+---------+ * Insertion is O(1) for data that are already in sort order, so that each element is added to the end of the list (assuming no resize is required). 

实施的angular度来看:

 +------------+---------------+----------+------------+------------+------------------+ | Underlying | Lookup | Ordering | Contiguous | Data | Exposes Key & | | structure | strategy | | storage | access | Value collection | +------------+---------------+----------+------------+------------+------------------+ | 2 arrays | Binary search | Sorted | Yes | Key, Index | Yes | | BST | Binary search | Sorted | No | Key | Yes | +------------+---------------+----------+------------+------------+------------------+ 

粗略地说 ,如果你需要原始的性能, SortedDictionary可能是一个更好的select。 如果你需要较less的内存开销和索引检索SortedList更好。 看到这个问题更多的时候使用哪个。

你可以在 这里阅读更多, 在这里 , 在这里 , 在 这里 。

我打开reflection器看看这个,因为似乎有一点关于SortedList混淆。 它实际上不是一个二叉search树, 它是一个键值对的sorting(按键)数组 。 还有一个TKey[] keysvariables,它与键值对同步sorting并用于二分search。

这里有一些来源(针对.NET 4.5)来备份我的声明。

私人会员

 // Fields private const int _defaultCapacity = 4; private int _size; [NonSerialized] private object _syncRoot; private IComparer<TKey> comparer; private static TKey[] emptyKeys; private static TValue[] emptyValues; private KeyList<TKey, TValue> keyList; private TKey[] keys; private const int MaxArrayLength = 0x7fefffff; private ValueList<TKey, TValue> valueList; private TValue[] values; private int version; 

SortedList.ctor(IDictionary,IComparer)

 public SortedList(IDictionary<TKey, TValue> dictionary, IComparer<TKey> comparer) : this((dictionary != null) ? dictionary.Count : 0, comparer) { if (dictionary == null) { ThrowHelper.ThrowArgumentNullException(ExceptionArgument.dictionary); } dictionary.Keys.CopyTo(this.keys, 0); dictionary.Values.CopyTo(this.values, 0); Array.Sort<TKey, TValue>(this.keys, this.values, comparer); this._size = dictionary.Count; } 

SortedList.Add(TKey,TValue):void

 public void Add(TKey key, TValue value) { if (key == null) { ThrowHelper.ThrowArgumentNullException(ExceptionArgument.key); } int num = Array.BinarySearch<TKey>(this.keys, 0, this._size, key, this.comparer); if (num >= 0) { ThrowHelper.ThrowArgumentException(ExceptionResource.Argument_AddingDuplicate); } this.Insert(~num, key, value); } 

SortedList.RemoveAt(int):void

 public void RemoveAt(int index) { if ((index < 0) || (index >= this._size)) { ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument.index, ExceptionResource.ArgumentOutOfRange_Index); } this._size--; if (index < this._size) { Array.Copy(this.keys, index + 1, this.keys, index, this._size - index); Array.Copy(this.values, index + 1, this.values, index, this._size - index); } this.keys[this._size] = default(TKey); this.values[this._size] = default(TValue); this.version++; } 

查看SortedList的MSDN页面 :

从备注部分:

SortedList<(Of <(TKey, TValue>)>)generics类是一个O(log n)检索的二叉search树,其中n是字典中元素的数量。 在此,它与SortedDictionary<(Of <(TKey, TValue>)>)generics类相似。 这两个类有相似的对象模型,都有O(log n)检索。 这两个类别在内存使用和插入和删除速度方面存在差异:

  • SortedList<(Of <(TKey, TValue>)>)使用比SortedDictionary<(Of <(TKey, TValue>)>)less的内存。
  • SortedDictionary<(Of <(TKey, TValue>)>)对于未sorting的数据O(log n) ,与SortedList<(Of <(TKey, TValue>)>) O(n)相比,具有更快的插入和删除操作。

  • 如果列表从sorting后的数据中一次性填充,则SortedList<(Of <(TKey, TValue>)>)SortedDictionary<(Of <(TKey, TValue>)>)更快。

这是performance如何比较彼此的视觉表示。

已经说了足够的话题了,但是为了简单起见,这是我的看法。

sorting字典应使用时 –

  • 需要更多的插入和删除操作。
  • 数据在无序。
  • 密钥访问是足够的,索引访问不是必需的。
  • 记忆不是一个瓶颈。

另一方面,在以下情况下应使用sorting列表 –

  • 更多的查找和更less的插入和删除操作是必需的。
  • 数据已经sorting(如果不是全部的话)。
  • 索引访问是必需的。
  • 内存是一个开销。

希望这可以帮助!!

索引访问(这里提到)是实际的区别。 如果您需要访问后继或前任,您需要SortedList。 SortedDictionary不能这样做,所以你是相当有限的如何使用sorting(第一/ foreach)。