9

我有一个字典,我通常用一个键访问,所以我需要快速随机访问读取。但是,对于一个功能,我需要处理字典中顺序很重要的每个项目。它似乎在测试中工作正常。依赖字典中项目的顺序可以吗?

4

5 回答 5

10

不可以。如果您需要保留订单,您还应该有一份商品清单。您可以将所需的所有操作封装在您自己的集合类中,这将同时更新字典和列表。

不幸的是,.NET 本身没有支持它的字典——这是一个相当常见的请求——Java 确实如此,就像LinkedHashMap一样。

于 2008-11-03T09:37:04.443 回答
4

您绝对不能依赖 Dictionary<> 按您添加它们的顺序返回结果 - 正如文档所述。

在测试中, Dictionary<> 似乎总是以它们添加的相同顺序枚举 KeyValuePairs<>。但是, Dictionary<> 的 Mono 实现没有。Mono 在实现行为时遵循文档,我假设他们看到了文档的那部分,然后以某种不维护顺序的方式实现。

另一种选择是使用 OrderedDictionary,它将保持顺序。

于 2011-05-24T15:49:06.920 回答
0

tpower,Dictionary并且SortedDictionary非常相似,因为它们都拥有一组对象,可以通过键访问。它们的不同之处在于它们的内部构建方式。

Dictionary据我所知,插入速度更快,而SortedDictionary建立在二叉树搜索算法之上,读取速度更快。

但是,在这两种情况下,内部顺序都是由键顺序维护的。无法保证您遍历整个集合的顺序与您插入项目的顺序相同。

在这种情况下,您可能需要同时存储列表和字典以满足您的不同需求。

于 2008-11-03T09:41:21.923 回答
-1

不。如果你想保持你的密钥井井有条,你最好使用SortedDictionary 。

编辑:或者,如果您想跟踪添加项目的顺序,请将您的密钥添加到链接列表中。

于 2008-11-03T09:30:11.837 回答
-2

该文档明确指出“出于枚举的目的,字典中的每个项目都被视为表示值及其键的 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.");
于 2008-11-03T11:31:54.447 回答