a SortedList<TKey,TValue>
和a 之间有什么实际的实际区别SortedDictionary<TKey,TValue>
吗?在任何情况下,您会专门使用一种而不是另一种吗?
SortedList<TKey,TValue>
而不是一个SortedList<T>
?为什么不执行IList<T>
呢?
a SortedList<TKey,TValue>
和a 之间有什么实际的实际区别SortedDictionary<TKey,TValue>
吗?在任何情况下,您会专门使用一种而不是另一种吗?
SortedList<TKey,TValue>
而不是一个SortedList<T>
?为什么不执行IList<T>
呢?
Answers:
是的-它们的性能特征差异很大。最好打电话给他们SortedList
,SortedTree
为更紧密地体现了落实。
查看其中每个()的MSDN文档SortedList
,SortedDictionary
以了解不同情况下不同操作的性能细节。这是一个不错的摘要(来自SortedDictionary
文档):
的
SortedDictionary<TKey, TValue>
通用类是O(log n)的检索,其中n是字典中的元件的数目的二进制搜索树。在这方面,它类似于SortedList<TKey, TValue>
泛型类。这两个类具有相似的对象模型,并且都具有O(log n)检索。这两类的区别在于内存使用以及插入和移除的速度:
SortedList<TKey, TValue>
使用的记忆体少于SortedDictionary<TKey, TValue>
。
SortedDictionary<TKey, TValue>
对未排序的数据O(log n)具有更快的插入和删除操作,而对O的O(n)具有更快的插入和删除操作SortedList<TKey, TValue>
。如果从排序数据中一次填充列表,
SortedList<TKey, TValue>
则速度比快SortedDictionary<TKey, TValue>
。
(SortedList
实际上是维护一个排序的数组,而不是使用树。它仍然使用二进制搜索来查找元素。)
这是一个表格视图,如果有帮助...
从性能角度来看:
+------------------+---------+----------+--------+----------+----------+---------+
| 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).
从实现的角度来看:
+------------+---------------+----------+------------+------------+------------------+
| 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
可能是一个更好的选择。如果您需要较少的内存开销,则索引检索SortedList
更适合。有关何时使用哪个的更多信息,请参见此问题。
BDictionary<Key,Value>
使用LoycCore而不是SortedDictionary
。
我破解了Reflector来看看这个,因为似乎有些困惑SortedList
。实际上,它不是二叉搜索树,而是键-值对的排序数组(按键)。还有一个TKey[] keys
与键值对同步排序变量,用于二进制搜索。
这是一些资料(针对.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):空
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):无效
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<(Of <(TKey, TValue>)>)
泛型类是用二叉搜索树O(log n)
的检索,其中n
在字典中元素的个数。在这方面,它类似于SortedDictionary<(Of <(TKey, TValue>)>)
泛型类。这两个类具有相似的对象模型,并且都具有O(log n)
检索功能。这两类的区别在于内存使用以及插入和移除的速度:
SortedList<(Of <(TKey, TValue>)>)
使用的记忆体少于SortedDictionary<(Of <(TKey, TValue>)>)
。
SortedDictionary<(Of <(TKey, TValue>)>)
与forO(log n)
相比,O(n)
对未排序的数据具有更快的插入和删除操作SortedList<(Of <(TKey, TValue>)>)
。如果从排序数据中一次填充列表,
SortedList<(Of <(TKey, TValue>)>)
则速度比快SortedDictionary<(Of <(TKey, TValue>)>)
。
关于这个话题已经足够了,但是为了简单起见,这是我的观点。
排序字典应在以下情况下使用:
另一方面,在以下情况下应使用排序列表:
希望这可以帮助!!