5
// No overrides required .. let CLR take care of equal and hashcode.
Class Foo {public Name{get; set;} public Address{get; set;}} 

Dictionary<List<Foo>, int> map = new Dictionary<List<Foo>, int>();

问题:

这段代码看起来好吗?我知道要成为 Map 中的键, Foo 需要覆盖 equals 和 hashcode 方法 - 要么覆盖两者,要么不覆盖。

我想知道 List of objects as keys 怎么样?当涉及到 List 时,平等意味着什么?上面定义的地图是否不受“地图中的对象丢失”问题的影响?

-卡勒菲尔

4

3 回答 3

5

这仅在您使用原始List<T>实例作为键时才有效。
如果您List<T>使用相同的项目创建一个新的,它将不会被视为相同的键,因为 List<T>不会覆盖Equals()and GetHashCode()

换句话说,它将使用引用相等。

如果你想改变它,你可以写一个IEqualityComparer<List<T>>.

于 2012-06-11T21:08:51.607 回答
3
List<int> a = new List<int>(1, 2, 3);
List<int> b = new List<int>(1, 2, 3); //different instance than a

Dictionary<List<int>, int>> map = new Dictionary<List<int>, int>>();
map.Add(a, a.Sum());
int aSum = map[b]; //KeyNotFoundException because this is a different instance.


HashSet<int> a = new HashSet<int>(1, 2, 3);
HashSet<int> b = new HashSet<int>(1, 2, 3); //different instance than a

Dictionary<HashSet<int>, int>> map1 = new Dictionary<HashSet<int>, int>>();
map1.Add(a, a.Sum());
int aSum = map1[b]; //KeyNotFoundException because this is a different instance.


HashSet<int> a = new HashSet<int>(1, 2, 3);
HashSet<int> b = new HashSet<int>(1, 2, 3); //different instance than a

Dictionary<HashSet<int>, int>> map2 = new Dictionary<HashSet<int>, int>>
  (HashSet<int>.CreateSetComparer()); //instance comparison not used - equal sets are equal
map2.Add(a, a.Sum());
int aSum = map2[b]; //6
于 2012-06-11T21:12:41.980 回答
0

当然,你可以,但那将是非常有限的。简单地说,一个组合的列表Foo,即使列表元素都相同Foo,也不一定相同List<Foo>。因此,您需要以某种明确的方式保留引用以确保密钥相同,或者制作复杂的密钥匹配功能。

简单地使用更好的密钥类型会好得多。

于 2012-06-11T21:10:26.357 回答