【发布时间】:2011-04-24 13:52:14
【问题描述】:
怀念Collections.unmodifiableMap(),我一直在基于this discussion实现一个只读的IDictionary包装器,我的单元测试很快就遇到了问题:
Assert.AreEqual (backingDictionary, readOnlyDictionary);
失败,即使键值对匹配。我又玩了一点,看起来至少(感谢 Simonyi)
Assert.AreEquals (backingDictionary, new Dictionary<..> { /* same contents */ });
确实通过了。
我快速浏览了Dictionary 和IDictionary 文档,令我惊讶的是,我找不到任何等效的Java Map 合约,即两个Maps 和entrySet()s 必须相等. (文档说 Dictionary -- not IDictionary -- 覆盖 Equals(),但不要说覆盖的作用。)
所以看起来 C# 中的键值相等是Dictionary 具体类的属性,而不是IDictionary 接口的属性。这是正确的吗?整个System.Collections 框架是否普遍如此?
如果是这样,我有兴趣阅读一些关于 MS 选择该方法的讨论 - 以及在 C# 中检查集合内容是否相等的首选方法。
最后,我不介意指向经过充分测试的 ReadOnlyDictionary 实现的指针。 :)
预计到达时间:明确地说,我不是寻找有关如何测试我的实现的建议——这相对来说是微不足道的。我正在寻找有关这些测试应该执行什么合同的指导。以及为什么。
ETA:伙计们,我知道IDictionary是一个接口,我知道接口不能实现方法。在 Java 中也是如此。尽管如此,Java 的Map 接口记录了来自equals() 方法的certain behavior 的期望。肯定有 .NET 接口可以做这样的事情,即使集合接口不在其中。
【问题讨论】:
-
WindowsBase 程序集的 MS.Internal.Utility 命名空间中有一个 ReadOnlyDictionary
。它不会覆盖 Equals。 -
我正在为 iOS 编写一个 Mono 应用程序,但这是一个有趣的数据点。两个
MS.Internal.Utility.ReadOnlyDictionaries的内容相同吗? -
为以后的读者注意:(1)PowerCollections 中的
Algorithms类提供了ReadOnly将集合(包括字典)包装为只读的方法。 (2) LINQ 的SequenceEqual() 适用于有序集合(包括字典)。
标签: java .net collections immutability equality