字典的行为就像一个有序的集合



我读过关于它不是有序集合的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);
}

上面的代码只打印字符串"first"。如果集合未订购,为什么它不打印和"第二个"字符串?

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

为什么要打印"second"?First返回一个且仅满足条件的元素。

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

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

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

最新更新