Ностальгируя по Collections.unmodifiableMap()
, я реализовал оболочку IDictionary
только для чтения на основе это обсуждение, и мой модульный тест быстро натолкнулся на проблему:
Assert.AreEqual (backingDictionary, readOnlyDictionary);
не выполняется, даже если пары ключ-значение совпадают. Я поигрался еще немного, и, по крайней мере, похоже (спасибо Simonyi)
Assert.AreEquals (backingDictionary, new Dictionary<..> { /* same contents */ });
действительно проходит.
Я быстро просмотрел _5 _ и документации IDictionary
, а также к моему удивлению, я не смог найти эквивалент Java Map
договариваются, что два Maps
с равным entrySet()s
должны быть равны. (В документации сказано, что Dictionary
- не IDictionary
- переопределяет Equals()
, но не говорится, что делает это переопределение.)
Таким образом, похоже, что равенство "ключ-значение" в C # является свойством конкретного класса Dictionary
, а не интерфейса IDictionary
. Это правильно? Это вообще верно в отношении всего System.Collections
фреймворка?
Если это так, мне было бы интересно прочитать обсуждение того, почему MS выбрала этот подход, а также того, какой предпочтительный способ - это проверить равенство содержимого коллекции в C #.
И, наконец, я бы не отказался указать на хорошо протестированную ReadOnlyDictionary
реализацию. :)
ETA: Чтобы было ясно, я не ищу предложения по тестированию моей реализации - это относительно тривиально. Я ищу руководство по условиям контракта, обязательного для выполнения этими тестами. И почему.
ETA: Ребята, я знаю IDictionary
, что это интерфейс, и я знаю, что интерфейсы не могут реализовывать методы. То же самое и на Java. Тем не менее, интерфейс Java Map
документирует ожидание определенное поведение из equals()
метода. Несомненно, должны быть интерфейсы .NET, которые делают такие вещи, даже если интерфейсов сбора среди них нет.
MS.Internal.Utility.ReadOnlyDictionaries
с одинаковым содержимым равны друг другу? - person David Moles   schedule 13.10.2010Algorithms
в PowerCollections предоставляетReadOnly
методы для упаковки коллекций (включая словари) только для чтения. (2) SequenceEqual () LINQ работает с упорядоченными коллекциями (включая словари). ). - person David Moles   schedule 24.06.2011