我正在处理遗留代码,我看到一个字典,其键是一个对象列表...
var myCrazyDictionary = new Dictionary<List<MyKeyObject>, List<MyValueObject>>();
这样的字典有何表现?你知道,因为引用类型...
它像这样神奇地工作吗?
// ????
myCrazyDictionary.Add(new List<MyKeyObject> { new MyKeyObject { Key1 = "1", Key2 = 2 } }, new List<MyValueObject> { new MyValueObject { Value = "!" } });
// ???????????
var result = myCrazyDictionary[new List<MyKeyObject> { new MyKeyObject { Key1 = "1", Key2 = 2 } }];
// Will this hold the value: "!" or crash or something else?
var byWhatBlackMagic = result[0].Value;
最佳答案
它会和你做字典一样Dictionary<Object, List<MyValueObject>>
刚刚做了一个new Object()
用于添加和检索。 List<T>
不会覆盖 Equals(object)
和 GetHashCode()
所以它只使用只比较对象引用的默认行为。它不会在列表内部进行比较。所以你的例子会抛出 KeyNotFoundException
当你尝试做 myCrazyDictionary[new List<MyKeyObject> { ... }]
因为您正在创建一个“新对象”,而该新对象不在字典中(因为您刚刚创建了它)。
你可以得到你想要的功能,你只需要做一个自定义IEqualityComparer<List<MyKeyObject>>
并将其传递给字典的构造函数。
注意! 如果您确实在 List<MyKeyObject>
中没有设置自定义比较器与您的自定义关联 Equals(List<MyKeyObject>, List<MyKeyObject>)
也不是你的习惯.GetHashCode(List<MyKeyObject>)
可以在它作为按键滚动时进行更改,否则您将破坏 Dictionary
的内部逻辑。 .
关于c# - 键为 List 的字典如何运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34860170/