是否有&#34;合同&#34;对于IDictionary<TKey, TValue>
接口,我应该在使用this[key] = newValue
实现值替换时遵循?一个例子:
IDictionary<MyKey, string> dict = CreateEmptyDict();
var k1 = new MyKey(123);
var k2 = new MyKey(123);
dict.Add(k1, "foo");
dict[k2] = "bar";
k1和k2是k1.Equals(k2)
并且它们具有相同的哈希码,但它们是引用类型ReferenceEquals(k1, k2) == false
。
BCL Dictionary<TKey, TValue>
将包含(k1, "bar")
。
我的问题是:这是一个&#34;合同&#34;我真的应该关注IDictionary<TKey, TValue>
的任何实现,或者如果在底层数据结构中更容易实现,我可以让我的实现包含(k2, "bar")
吗?
答案 0 :(得分:5)
它的实现特定至少某些范围。例如,Dictionary<,>
允许您指定用于检查密钥是否相等的IEqualityComparer<T>
,SortedDictionary<,>
不使用Equals
和GetHashCode
所有 - 相反,它使用IComparer<T>
来检查密钥排序。
创建一个依赖仅引用相等的字典是完全合理的 - 但请确保您非常仔细地记录。我会注意到你并不需要自己实现IDictionary<,>
来做到这一点......你只需要使用Dictionary<,>
和使用引用相等的自定义相等比较器RuntimeHelpers.GetHashCode()
获取Object.GetHashCode()
在未被覆盖的情况下将使用的哈希码。
实现字典会非常非常奇怪,因此您可以多次添加确切的相同的值作为键 - 但是如何判断键实际上是否相等则是不同的问题,IMO。