SorteDictionary是根据MSDN按键排序的。这是否意味着当您在foreach中枚举它时,您可以确定它将被排序?或者它只是意味着SortedDictionary在内部工作以在各种情况下具有更好的性能?
答案 0 :(得分:9)
字典维护在 使用内部树排序的顺序。 每个新元素都位于 正确的排序位置,树是 调整以维持排序顺序 每当元素被删除。而 枚举,排序顺序是 保持。
答案 1 :(得分:4)
当您枚举集合时,它按键排序(即使您枚举说Values
集合)。在内部,集合实现为二叉搜索树(根据文档)。值的插入和查找都是O(log n)(意味着它们非常有效)。
答案 2 :(得分:0)
是的,这正是它的含义。
编辑:部分内容“这是否意味着您可以确定在foreach中枚举它时会对其进行排序?”
答案 3 :(得分:0)
如果您枚举SortedDictionary
中的项目,则项目将按项目键的排序顺序返回。如果您按SortedDictionary
中的键进行枚举,则键也将按排序顺序返回。也许有点令人惊讶的是,如果您按其值枚举SortedDictionary
,则按键的排序顺序返回值,不值的排序顺序。< / p>
<强>演示:强>
请注意,在此演示中,添加到SortedDictionary
的项目是而非按排序顺序添加。
此外,如果您计划按其值枚举字典并且可能重复值,请考虑使用反向查找功能return an IEnumerable<T>。 (当然,对于大型词典,按其值查找键可能会导致性能不佳。)
using System;
using System.Collections.Generic;
using System.Linq;
class SortedDictionaryEnumerationDemo
{
static void Main()
{
var dict = new SortedDictionary<int, string>();
dict.Add(4, "Four");
dict.Add(5, "Five");
dict.Add(1, "One");
dict.Add(3, "Three");
dict.Add(2, "Two");
Console.WriteLine("== Enumerating Items ==");
foreach (var item in dict)
{
Console.WriteLine("{0} => {1}", item.Key, item.Value);
}
Console.WriteLine("\n== Enumerating Keys ==");
foreach (int key in dict.Keys)
{
Console.WriteLine("{0} => {1}", key, dict[key]);
}
Console.WriteLine("\n== Enumerating Values ==");
foreach (string value in dict.Values)
{
Console.WriteLine("{0} => {1}", value, GetKeyFromValue(dict, value));
}
}
static int GetKeyFromValue(SortedDictionary<int, string> dict, string value)
{
// Use LINQ to do a reverse dictionary lookup.
try
{
return
(from item in dict
where item.Value.Equals(value)
select item.Key).First();
}
catch (InvalidOperationException e)
{
return -1;
}
}
}
预期输出:
== Enumerating Items ==
1 => One
2 => Two
3 => Three
4 => Four
5 => Five
== Enumerating Keys ==
1 => One
2 => Two
3 => Three
4 => Four
5 => Five
== Enumerating Values ==
One => 1
Two => 2
Three => 3
Four => 4
Five => 5