Почему Microsoft не предоставила универсальную реализацию OrderedDictionary?
Я видел несколько пользовательских реализаций, включая: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx
Но почему Microsoft не включила его в базовую библиотеку .net? Конечно, у них была причина не создавать универсальный .... но что это?
До публикации этого сообщения я видел: /programming/2629027/no-generic-implementation-of-ordereddictionary
Но это только подтверждает, что его не существует. Не почему это не существует.
Благодарность
SortedDictionary<TKey, TValue>
: msdn.microsoft.com/en-us/library/f7fta44c.aspxОтветы:
В C # 4.0 В двух словах я читал это:
OrderedDictionary
является комбинациейHashTable
иArrayList
ArrayList
ArrayList
класс используется главным образом для обратной совместимости с Framework 1.x ...»ArrayList
Функционально похож наList<object>
»ArrayList
чем сList<object>
»Вывод?
Нет универсального,
OrderedDictionary
потому что его базовая конструкция является (неофициально) обесцененным классом, который не имеет самой универсальной версии.источник
OrderedDictionary
ковариации и противодействия?В
OrderedDictionary
перегруженной операции индексации , так что индексация с целым числомN
будет получить элемент в положенииN
, при индексировании сObject
извлечет элемент coresponding к этому объекту. Если бы можно было создатьOrderedDictionary<int, string>
под названиемmyDict
и добавить элементы (1, «Джордж») и (0, «Фред») в этом порядке, должноmyDict[0]
возвращаться «Джордж» или «Фред»?Такая проблема могла быть решена путем наложения ограничения класса на тип ключа. С другой стороны, большая часть полезности универсальных коллекций проистекает из их способности эффективно работать с типами значений. Наложение ограничения класса на тип ключа может показаться немного уродливым.
Если класс не должен был быть CLS-совместимым, а просто должен был работать с vb.net, разумный дизайн мог бы использовать именованные индексированные свойства. Таким образом, в приведенном выше примере,
myDict.ByKey[0]
получилось бы «Фред», иmyDict.BySequence[0]
уступил бы «Джордж». К сожалению, такие языки, как C #, не поддерживают именованные индексированные свойства. В то время как можно было бы кое-что добавить, чтобы разрешить использование вышеупомянутого синтаксиса даже без таких свойств, неудачное решение обернуть поля структур, таких какPoint
и , но вместо этого изменить коллекцию, на которую он ссылается).Rectangle
означает, что дляmyDict.ByKey[0] = "Wally"
работыmyDict.ByKey
придется вернуть новый объект класса. Структура была бы более эффективной, но компиляторы отклоняли бы то, что выглядело как запись в структуру только для чтения (несмотря на то, что свойство не изменило бы структуру, возвращаемуюByKey
Лично я думаю, что было бы неплохо иметь объект dictionary-ish, который был задан как отслеживающий порядок вставки; Я также хотел бы иметь объект dictionary-ish, который мог бы легко вернуть ключ, связанный с конкретным ключом (например, если у вас есть словарь без учета регистра и добавлена запись с ключом "GEORGE", может спросить у словаря, какой ключ связан с «Джорджем» без необходимости поиска по всем
KeyValuePair
объектам, возвращенным в перечислении.источник
Потому что поддержание порядка предотвращает поиск O (1), который подразумевает IDictionary, если вы не оберните две коллекции (одну для порядка, одну для поиска), что делает добавление / удаление менее производительным и увеличивает использование памяти. Или вы могли бы иметь более медленный поиск в обмен на меньшее использование памяти.
Я предполагаю, что здесь не было «явно лучшего» выбора, поэтому он не вошел в стандартную библиотеку. Особенно в 2.0, C # все еще учился на ошибках Java. Я не удивлюсь, если бы подход Java «все и кухонная раковина» к коллекциям в их стандартной библиотеке также рассматривался как нечто, чего следует избегать.
источник
OrderedDictionary
AList
. Я полагаю, что любой, у кого есть законный вариант использования для,OrderedDictionary
использует его специально, потому что им нужен класс коллекции, который имеет поиск O (1), но также помнит порядок вставки, и в этом случае использование дополнительной памяти неизбежно и, следовательно, приемлемо.