我有一个字典,我通常用一个键访问,所以我需要快速随机访问读取。但是,对于一个功能,我需要处理字典中顺序很重要的每个项目。它似乎在测试中工作正常。依赖字典中项目的顺序可以吗?
5 回答
不可以。如果您需要保留订单,您还应该有一份商品清单。您可以将所需的所有操作封装在您自己的集合类中,这将同时更新字典和列表。
不幸的是,.NET 本身没有支持它的字典——这是一个相当常见的请求——Java 确实如此,就像LinkedHashMap一样。
您绝对不能依赖 Dictionary<> 按您添加它们的顺序返回结果 - 正如文档所述。
在测试中, Dictionary<> 似乎总是以它们添加的相同顺序枚举 KeyValuePairs<>。但是, Dictionary<> 的 Mono 实现没有。Mono 在实现行为时遵循文档,我假设他们看到了文档的那部分,然后以某种不维护顺序的方式实现。
另一种选择是使用 OrderedDictionary,它将保持顺序。
tpower
,Dictionary
并且SortedDictionary
非常相似,因为它们都拥有一组对象,可以通过键访问。它们的不同之处在于它们的内部构建方式。
Dictionary
据我所知,插入速度更快,而SortedDictionary
建立在二叉树搜索算法之上,读取速度更快。
但是,在这两种情况下,内部顺序都是由键顺序维护的。无法保证您遍历整个集合的顺序与您插入项目的顺序相同。
在这种情况下,您可能需要同时存储列表和字典以满足您的不同需求。
不。如果你想保持你的密钥井井有条,你最好使用SortedDictionary 。
编辑:或者,如果您想跟踪添加项目的顺序,请将您的密钥添加到链接列表中。
该文档明确指出“出于枚举的目的,字典中的每个项目都被视为表示值及其键的 KeyValuePair<(Of <(TKey, TValue>)>) 结构。返回项目的顺序是未定义。” 但我不相信。
在我执行的所有测试中,项目总是按插入排序。
我发现这很奇怪,因为我还测试了 HashMap 和 LinkedHashMap(在 Java 中),并且 HashMap 中的顺序与预期的不正确,但是就像 Jon Skeet 所说的那样,LinkedHashMap 中的顺序是正确的。
任何人都可以用字典指出失败测试吗?
这是我用来测试的代码:
IDictionary<string, int> dic = new Dictionary<string, int>(10);
Console.WriteLine("Adding ...");
for (int i = 0; i < 1000000; i++)
{
Guid guid = Guid.NewGuid();
dic.Add(guid.ToString(), i);
}
Console.WriteLine("Testing ...");
bool first = true;
int lastItem = 0;
foreach (var item in dic.Values)
{
if (first)
{
first = false;
}
else
{
if (lastItem != item - 1)
{
Console.WriteLine("Test Failed !");
break;
}
}
lastItem = item;
}
Console.WriteLine("Done.");