c# - 键为 List 的字典如何运行?

标签 c# .net

我正在处理遗留代码,我看到一个字典,其键是一个对象列表...

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/

相关文章:

.NET const 影响编译的程序集大小

c# - 在 C# 中获取字符串中的第一个单词和其余单词的最佳方法

c# - .NET Settings.Reload() 和 Settings.Save() 设置未加载的问题

c# - 是否可以通过 IContext 解析 Ninject 工厂方法中的调用者实例?

c# - 在 Fluent NHibernate 中通过 ID 设置引用的实体

.net - 在.NET中,为什么我可以访问类中类实例的私有(private)成员?

c# - 如何在 WPF 中指定 Canvas 上椭圆形状的位置?

c# - DataTemplate 内的 DataTemplate - ListBox 内的 ListBox

c# - KinectSensor.DepthStream.OpenNextFrame 返回 NULL

c# - 使用代理的 ASP .net 核心 jwt 身份验证