我有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]);
}
答案 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)。