如果词典的内容完全相同,那么它的顺序是否相同?

And*_*ndy 4 .net c# dictionary

我知道字典的顺序是未定义的,MSDN如此说:

出于枚举的目的,字典中的每个项都被视为表示值及其键的KeyValuePair结构.返回项的顺序未定义.

这很好,但是如果我有两个字典的实例,每个都有相同的内容,那么顺序是否相同?

我猜是这样的,因为据我所知,顺序是由键的哈希决定的,如果两个词典具有相同的键,它们具有相同的哈希值,因此顺序相同...

... 对?

谢谢!

安迪.

Jar*_*Par 9

不,不能保证是同一个订单.想象一下,您在Dictionary<TKey, TValue>具有相同哈希码的几个项目中的情况.如果它们以不同的顺序添加到两个词典中,则会导致枚举中的顺序不同.

例如,考虑以下(符合相等的)代码

class Example
{
    public char Value;
    public override int GetHashCode()
    {
        return 1;
    }
    public override bool Equals(object obj)
    {
        return obj is Example && ((Example)obj).Value == Value;
    }
    public override string ToString()
    {
        return Value.ToString();
    }
}

class Program
{
    static void Main(string[] args)
    {
        var e1 = new Example() { Value = 'a' };
        var e2 = new Example() { Value = 'b' };
        var map1 = new Dictionary<Example, string>();
        map1.Add(e1, "1");
        map1.Add(e2, "2");

        var map2 = new Dictionary<Example, string>();
        map2.Add(e2, "2");
        map2.Add(e1, "1");

        Console.WriteLine(map1.Values.Aggregate((x, y) => x + y));
        Console.WriteLine(map2.Values.Aggregate((x, y) => x + y));
    }
}
Run Code Online (Sandbox Code Playgroud)

运行该程序的输出是

12
21
Run Code Online (Sandbox Code Playgroud)