怀旧Collections.unmodifiableMap()
,我一直在实现一个基于this discussion的只读IDictionary
包装,我的单元测试很快遇到了一个问题:.NET Dictionary/IDictionary的Equals()合同vs等于()Java地图的合同
Assert.AreEqual (backingDictionary, readOnlyDictionary);
失败,即使键值对匹配。我玩了更多一点,至少看起来像(感谢西蒙尼)
Assert.AreEquals (backingDictionary, new Dictionary<..> { /* same contents */ });
确实通过。
我率先通过了Dictionary
和IDictionary
文档咋一看,让我吃惊我无法找到Java Map
合同两个Maps
平等entrySet()s
必须相等的任何等同。 (该文档说Dictionary
- 不IDictionary
- 覆盖Equals()
,但不要说超越做什么。)
所以它看起来像在C#中的键值平等是Dictionary
具体类的属性,而不是IDictionary
接口。这是正确的吗?整个System.Collections
框架通常是真的吗?
如果是这样,我有兴趣阅读一些关于为什么MS选择这种方法的讨论 - 以及首选方法是检查C#中的收集内容是否相同。
最后,我不介意指向经过充分测试的ReadOnlyDictionary
实现。 :)
ETA:要清楚,我不寻找如何来测试我的工作的建议 - 这是比较琐碎。我正在寻找这些测试应该执行的合同的指导。为什么。
ETA:伙计们,我知道IDictionary
是一个接口,而我知道界面无法实现的方法。在Java中是一样的。尽管如此,Java Map
接口记录了equals()
方法的期望certain behavior。毫无疑问,必须有.NET接口来处理这种事情,即使这些接口不在其中。
WindowsBase程序集中的MS.Internal.Utility命名空间中有一个ReadOnlyDictionary。它不会覆盖等于。 –
dtb
2010-10-12 22:03:55
我正在为iOS编写一个Mono应用程序,但这是一个有趣的数据点。两个“MS.Internal.Utility.ReadOnlyDictionaries”具有相同的内容吗? – 2010-10-12 22:06:16
注意到后面的读者:(1)[PowerCollections]中的'Algorithms'类(http://powercollections.codeplex.com/)提供了用于将集合(包括字典)包装为只读的'ReadOnly'方法。 (2)LINQ的[SequenceEqual()](http://msdn.microsoft.com/en-us/library/bb348567.aspx)适用于有序集合(包括字典)。 – 2011-06-23 23:48:14