Упорядоченный список ключевых значений? - PullRequest
7 голосов
/ 18 июня 2010

Есть ли в .net коллекция, которая позволяет хранить KeyValuePair<string, string>, которая сохраняет порядок вставки?
OrderedDictionary выглядел многообещающе, но, похоже, довольно не хватает.
Теперь я смотрю в IOrderedEnumerable>, но я не могу найти какую-либо реализацию, кроме ISortedDictionary, но это не то, что я хочу. Сортировка не требуется, важен только порядок вставки.

Обновление
Причина, по которой мне не нравится OrderedDictionary, заключается в том, что он не является общим.

Ответы [ 5 ]

9 голосов
/ 18 июня 2010

OrderedDictionary - это то, что вам нужно, если вам нужен как ключ, так и последовательный доступ к элементам ... это просто комбинация хэш-таблицы и списка.Он предоставляет средства для доступа к элементам в нем либо по индексу вставки, либо по ключу.Это единственная коллекция в .NET, которая делает это.К сожалению, он не является универсальным.

Если OrderedDictionary не удовлетворяет вашим потребностям исключительно потому, что он не является универсальным - тогда вы можете использовать версию, которая предоставляет общий эквивалент .Если есть другие причины, по которым он не работает, обновите ваше сообщение, и мы сможем найти лучший вариант.

Хотя вы, конечно, можете создать свой собственный List<KeyValuePair<string,string>>, вы потеряете возможность поиска поключ эффективно.Теперь вы, конечно, можете свернуть свою собственную реализацию упорядоченного доктрины, которая объединила список / диктат ... но пост, на который я ссылался, уже делает это.

8 голосов
/ 02 октября 2012

Несмотря на то, что я опаздываю к игре, .NET Framework 4.5 предоставляет новые классы для вас. См. SortedList<TKey, TValue> или SortedDictionary<TKey, TValue>. Если вам интересно, какой из них следует использовать, в MSDN есть несколько веских причин, по которым вы можете выбрать один из них.

Универсальный класс SortedList представляет собой массив пар ключ / значение с поиском O (log n), где n - количество элементов в словаре. В этом он похож на универсальный класс SortedDictionary. Два класса имеют похожие объектные модели, и оба имеют O (log n) извлечения. Эти два класса различаются в использовании памяти и скорости вставки и удаления:

  • SortedList<TKey, TValue> использует меньше памяти, чем SortedDictionary<TKey, TValue>.
  • SortedDictionary<TKey, TValue> имеет более быстрые операции вставки и удаления для несортированных данных, O (log n), в отличие от O (n) для SortedList<TKey, TValue>.
  • Если список заполняется сразу из отсортированных данных, SortedList<TKey, TValue> быстрее, чем SortedDictionary<TKey, TValue>.

Другое различие между классами SortedDictionary<TKey, TValue> и SortedList<TKey, TValue> заключается в том, что SortedList<TKey, TValue> поддерживает эффективное индексированное извлечение ключей и значений через коллекции, возвращаемые свойствами Keys и Values. Нет необходимости заново создавать списки при обращении к свойствам, поскольку списки являются просто оболочками для внутренних массивов ключей и значений.

Обе ссылки имеют схожий раздел примечаний (отсюда и цитата). У них также есть больше информации для обоих классов. Я рекомендую прочитать оба раздела, если вы заинтересованы в использовании одного из них.

7 голосов
/ 18 июня 2010

Просто используйте List<KeyValuePair<T,T>>.Они хранятся в порядке вставки.Каждый раз, когда вы добавляете к нему, самый новый добавляется в конец списка.

так

var list = new List<KeyValuePair<String,String>>();

list.Add(new KeyValuePair<String,String>("",""));

Если вы хотите вытащить их по порядку, просто используйте:

list.ForEach(x=>...);

или

foreach(var item in list){
...}
3 голосов
/ 18 июня 2010

Возможно, вы захотите бросить один, используя Queue<T>, где T - KeyValuePair<string, string>. Это более надежный контракт, который явно гарантирует порядок ввода.

http://msdn.microsoft.com/en-us/library/7977ey2c.aspx

0 голосов
/ 18 июня 2010

Вы должны просто иметь возможность использовать List<KeyValuePair<string,string>>. На самом деле я не могу найти в документации MSDN о том, что порядок вставки гарантирован, но это довольно безопасная ставка ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...