Чому в .net немає загальної реалізації OrdersDictionary?


26

Чому Microsoft не забезпечила загальну реалізацію OrdersDictionary?

Я бачив кілька спеціальних реалізацій, серед яких: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx

Але чому Microsoft не включила його до базової бібліотеки .net? Звичайно, вони мали причину не будувати загального .... але що це?

Перед публікацією цього повідомлення я бачив: /programming/2629027/no-generic-implementation-of-ordereddictionary

Але це просто підтверджує, що його не існує. Не чому цього не існує.

Спасибі


2
Завжди є SortedDictionary<TKey, TValue>: msdn.microsoft.com/en-us/library/f7fta44c.aspx
Travis Gockel

2
Якщо я неправильно розумію документи SortedDict, я цього не хочу. Я не хочу, щоб сортування було зроблено. Я просто хочу масив, до якого я також можу отримати доступ за ключем. У всякому разі, мені дуже цікаво, чому МС пропустив це. (Тонкі питання тощо)
nonot1

Який типовий випадок використання упорядкованого словника? Я з усіх сил намагаюся придумати один із верхівки голови.
Carson63000

1
@Carson у будь-який час у вас є масив даних, до яких також потрібен швидкий випадковий доступ. Для простого зберігання в Dict втрачається інформація про замовлення, а використання масиву вимагає збереження власного індексу.
nonot1

2
Попросіть Еріка Ліпперта прочитати та відповісти на ваше запитання. Зазвичай він дуже приємний, щоб допомогти у вирішенні таких питань. Я думаю, ви можете зв’язатися з ним через його блог: blogs.msdn.com/b/ericlippert
devuxer

Відповіді:


17

В C # 4.0 In Ullshell я прочитав це:

  1. An OrderedDictionary- це комбінація a HashTableіArrayList
  2. Родового немає ArrayList
  3. "Негенерік ArrayList Клас використовується головним чином для зворотної сумісності з Framework 1.x ..."
  4. " ArrayListФункціонально подібний доList<object> "
  5. "Відображення легше з негенеріком, ArrayListніж List<object>"

Висновок?

Немає загального, OrderedDictionaryоскільки його основна конструкція - це (неофіційно) амортизований клас, який не має самої загальної версії.


4
Це насправді не відповідає на питання. Узагальнений OrriedDictionary очевидно може бути побудований на загальному словнику та загальному списку.
ЖакБ

Одне застереження використання класу - якщо інтерфейс користувача не змінить того, хто переймається реалізацією? Ну, скажімо, мовна команда дизайнерів / компіляторів може віддати перевагу загальному успадкуванню свого негенеричного аналога . Мої шпигунські почуття килимки. Для початку: Чи відрізняються (безпосередні) предки землею міною десь на еволюційному шляху OrderedDictionaryковаріації та протиріччя?
radarbob

15

У 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, але замість цього змініть колекцію, на яку вона містить посилання).

Особисто я вважаю, що об'єкт, що відповідає словнику, який був визначений як відстеження порядку вставки, було б приємною справою; Я також хотів би мати об’єкт-словник, який міг би легко повернути ключ, пов'язаний з певним ключем (так, наприклад, якщо у словника нечутливий до регістру і додав запис із ключем "GEORGE", один можна запитати у словнику, який ключ пов’язаний з "Джорджем" без необхідності пошуку всіх KeyValuePairоб'єктів, повернених у перерахунку.


3

Оскільки підтримка порядку перешкоджає пошуку O (1), який передбачає IDictionary, якщо ви не загортаєте дві колекції (одну для замовлення, одну для пошуку), що робить додавання / видалення менш ефективним та збільшує використання пам'яті. Або ви могли б повільніше шукати в обмін на менше використання пам'яті.

Я здогадуюсь, що тут не було «явно кращого» вибору, тому він не зайшов у стандартну бібліотеку. Особливо близько 2.0, C # ще вчився з помилок Java. Я не був би здивований, якби підхід Яви "все і кухонна раковина" до колекцій у їхній стандартній бібліотеці також розглядався як те, чого слід уникати.


1
Більш повільний огляд в обмін на меншу кількість пам'яті просто ефективно робить OrderedDictionaryа List. Я думаю, що хтось із законним випадком використання для an OrderedDictionaryвикористовує його спеціально, тому що їм потрібен клас колекції, який має пошук O (1), але також пам'ятає порядок вставки, і в цьому випадку використання додаткової пам'яті неминуче і, таким чином, прийнятне.
Авіон47
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.