SortedList和SortedDictionary有什么区别?
SortedList<TKey,TValue>
和SortedDictionary<TKey,TValue>
之间是否有实际的区别? 有什么情况下你会专门使用一个而不是另一个?
是的 – 他们的performance特征差别很大。 把它们称为SortedList
和SortedTree
可能更好一些,因为它更接近地反映了实现。
查看他们每个人( SortedList
, SortedDictionary
)的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[] keys
variables,它与键值对同步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)。