我已经阅读了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;字符串,如果集合没有订购?
答案 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框架的未来版本中可以改变