字典表现为有序收集

时间:2017-12-01 08:56:52

标签: c# dictionary

我已经阅读了Dictionary类型,因为它不是有序集合(因为它是KVP)。但我有以下代码:

        var dictionary = new Dictionary<Func<bool>, string>
        {
            { () => true, "first" },
            { () => true, "second" }
        };

        for (var i = 0; i < 40; i++)
        {
            Console.WriteLine(dictionary.First(f => f.Key()).Value);
        }

上面的代码只打印字符串&#34; first&#34;。为什么不打印和&#34;秒&#34;字符串,如果集合没有订购?

2 个答案:

答案 0 :(得分:2)

使用KeyValuePair并不是Dictionary无序的原因。 SortedDictionary也使用KeyValuePair,但是因为那个被实现为平衡的黑色红色二叉树而被排序。 Dictionary实现为哈希映射。因此,顺序取决于密钥object生成的哈希值和桶的数量。在您的情况下,它始终具有相同的顺序,因为两个关键元素var key = new Func<bool>(() => true)都生成相同的哈希码。您可以使用GetHashCode()进行检查。如果两个密钥具有相同的哈希码,则它们将被添加到同一个桶中。每个存储桶只是一个列表,其中包含添加它们的项目的顺序。

答案 1 :(得分:0)

为什么要打印“秒”? First返回满足条件的唯一元素。

它内部循环遍历所有元素(按照未指定的顺序,我假设),并在满足条件时停止。

因此,在您的情况下,() => true, "first"对恰好是第一次测试。它返回true,因此返回

This sample显示枚举的顺序(很可能与First中的测试条件的顺序相同):正如其他人所指出的那样,并且如MSDN中所述,这个顺序是未定义的:它是一个实现细节在.Net框架的未来版本中可以改变