Есть ли в .NET коллекция, которая работает как словарь и список одновременно? - PullRequest
2 голосов
/ 10 сентября 2010

То, что я хочу - это, по сути, коллекция, представляющая собой гибрид словаря и списка. Мне нужна коллекция, в которую я могу добавить пары ключ / значение (например, словарь), но при этом иметь возможность извлекать значения (без ключей) в том же порядке, в котором я их добавил (например, список)? Существует ли такая коллекция в .NET?

Спасибо

Ответы [ 4 ]

13 голосов
/ 10 сентября 2010

Существует неуниверсальная структура данных с именем OrderedDictionary, которая делает то, что вы хотите.Он имеет два индексатора, один из которых принимает Object и выполняет поиск по ключу / значению, а другой - int и выполняет поиск по индексу.Вы также можете перечислить содержимое в том порядке, в котором вы их добавили.

Я не вижу в документации ничего о том, достигает ли поиск по словарю O (1) (т. Е. Быстро) поведение.Учитывая, что он реализует ISerializable, весьма вероятно, что он использует хеш-коды объектов и, следовательно, имеет O (1) поиск по словарю.

Вы также можете создать свой собственный универсальный тип, который инкапсулируети List<T>, и Dictionary<TKey,TValue>.

2 голосов
/ 12 сентября 2010

System.Collections.ObjectModel.KeyedCollection очень близко к тому, что вы запрашиваете, за исключением того, что ключ словаря должен быть получен из значения.

0 голосов
/ 10 сентября 2010
  • Создайте новый класс, который обернет словарь
  • при добавлении данных, оберните данные в маленький вспомогательный класс, который вводит индекс
  • при возврате значений, упорядочите их согласноindex

не будет монстром производительности, но должен работать нормально.В противном случае вы можете реализовать свой собственный LinkedHashMap , как в Java.

Кстати, взгляните на это: LinkedHashMap в .NET

editМне действительно нравится идея Уэслихилса: заключать в один класс List и Dictionary.Добавляйте всегда к обоим и возвращайте список вместо Dictionary.Values.

0 голосов
/ 10 сентября 2010

Нет, в фреймворке на данный момент нет ничего, что реализует эту функциональность (но см. Правку ниже).

В основном вы захотите составить List<T> и Dictionary<TKey, TValue> в своем собственном классе.

РЕДАКТИРОВАТЬ: я действительно забыл о OrderedDictionary, как указал Уэслихилл, - но я не верю, что в такой структуре есть универсальная коллекция. Я предполагаю, что вы на самом деле хотите универсальную коллекцию? Вы можете написать обертку вокруг OrderedDictionary конечно ...

РЕДАКТИРОВАТЬ: Быстрое примечание: хотя упаковка коллекции не должна быть сложной, вы потеряете одно преимущество общих коллекций: избегать бокса. Конечно, не проблема, если ваши ключи и значения являются ссылочными типами.

...