Dictionary.Keys.List()[i]是否对应于Dictionary.Values.ToList()[i]?

时间:2011-02-10 12:34:04

标签: c# dictionary

我有Dictionary数据类型。我的问题是,Dictionary.Keys.ToList()[i]始终与Dictionary.Values.ToList()[i]相对应吗?也就是说,以下测试总是会通过

public void DictionaryTest(int i, Dictionary<U,T> dict)
{
  var key = dict.Keys.ToList()[i];
  Assert.AreEqual(dict[key], dict.Values.ToList()[i]); 
}

4 个答案:

答案 0 :(得分:6)

我会根据MSDN

这样说出来
  

Dictionary.ValueCollection中的值的顺序是未指定的,但它与Keys属性返回的Dictionary.KeyCollection中的关联键的顺序相同。

答案 1 :(得分:1)

检查Dictionary.Keys Property的MSDN条目:

  

未指定Dictionary.KeyCollection中键的顺序,但它与Values属性返回的Dictionary.ValueCollection中的关联值的顺序相同。

答案 2 :(得分:0)

在你的代码中 - 是的。 但是如果你将GetHashCode()重写为U Class,然后进行一些更改,这些更改将改变GetHashCode()的值并调用Assert,那么它可能会为false,导致Dictionary被实现为哈希表。下一个代码返回false:

class Program
    {
        static void Main(string[] args)
        {
            Dictionary<A, int> d = new Dictionary<A, int>();
            for (int i = 1; i <= 10; i++)
            {
                d.Add(new A { Hash = i}, i);
            }
            DictionaryTest(5, d);
        }

        public static void DictionaryTest(int i, Dictionary<A, int> dict)
        {
            A key = dict.Keys.ToList()[i];
            key.Hash = 4;
            Console.WriteLine(dict[key].Equals(dict.Values.ToList()[i]));
            Console.ReadKey();
        }
    }

    public class A
    {
        public int Hash { get; set; }

        public override bool Equals(object obj)
        {
            return this.GetHashCode() == obj.GetHashCode();
        }
        public override int GetHashCode()
        {
            return Hash;
        }
    }

答案 3 :(得分:0)

Reflector说,在Framework 2.0 - 4.0中,KeyCollection和ValueCollection都枚举在dictionary.entries集合中。这就是为什么订单会一样的。 顺便说一句,这个命令将用于枚举字典本身(KeyValuePairs)。