Nostalgisch für Collections.unmodifiableMap()
, habe ich implementiert einen schreibgeschützten IDictionary
Wrapper basierend auf this discussion, und mein Komponententest lief schnell auf ein Problem:Equals() Vertrag für .NET-Wörterbuch/IDictionary vs equals() Vertrag für Java-Karte
Assert.AreEqual (backingDictionary, readOnlyDictionary);
schlägt fehl, obwohl die Schlüssel/Wert-Paare übereinstimmen. Ich spielte ein wenig mehr herum, und es sieht zumindest so aus (danke Simonyi)
Assert.AreEquals (backingDictionary, new Dictionary<..> { /* same contents */ });
geht vorbei.
Ich nahm einen kurzen Blick durch die Dictionary
und IDictionary
Dokumentation, und zu meiner Überraschung konnte ich keine Äquivalent des Java Map
Vertrages finden, die zwei Maps
mit gleich entrySet()s
gleich sein müssen. (Die docs sagen, dass Dictionary
- nichtIDictionary
- überschreibt Equals()
, aber nicht sagen, was das Überschreiben der Fall ist.)
So sieht es aus wie Schlüssel-Wert-Gleichheit in C# ist eine Eigenschaft der Dictionary
konkrete Klasse nicht von der IDictionary
Schnittstelle. Ist das richtig? Gilt es generell für das gesamte System.Collections
Framework?
Wenn ja, würde mich interessieren, eine Diskussion darüber zu lesen, warum MS diesen Ansatz wählte - und auch, wie der bevorzugte Weg wäre, die Gleichheit der Sammlungsinhalte in C# zu überprüfen.
Und schließlich hätte ich nichts gegen einen Zeiger auf eine gut getestete ReadOnlyDictionary
Implementierung. :)
ETA: Um klar zu sein, ich bin nicht die Suche nach Anregungen, wie meine Implementierung zu testen - das relativ trivial ist. Ich suche nach Anleitung auf welchen Vertrag diese Tests erzwingen sollten. Und warum.
ETA: Leute, Ich weißIDictionary
eine Schnittstelle ist, und ich Schnittstellen können nicht wissen, Methoden implementieren. In Java ist es dasselbe. Dennoch dokumentiert die Java Map
Schnittstelle eine Erwartung von certain behavior von der equals()
Methode. Sicherlich muss es .NET-Schnittstellen geben, die solche Dinge tun, selbst wenn die Sammelschnittstellen nicht darunter sind.
Es gibt ein ReadOnlyDictionary im Namespace MS.Internal.Utility in der WindowsBase-Assembly. Es überschreibt nicht Equals. –
dtb
Ich schreibe eine Mono-App für iOS, aber das ist ein interessanter Datenpunkt. Sind zwei "MS.Internal.Utility.ReadOnlyDictionaries" mit den gleichen Inhalten gleich? –
Hinweis für spätere Leser: (1) Die 'Algorithms'-Klasse in [PowerCollections] (http://powercollections.codeplex.com/) bietet 'ReadOnly'-Methoden zum Umbrechen von Sammlungen (einschließlich Wörterbüchern) als schreibgeschützt. (2) LINQs [SequenceEqual()] (http://msdn.microsoft.com/en-us/library/bb348567.aspx) arbeitet mit geordneten Sammlungen (einschließlich Wörterbüchern). –