Существует ли универсальная коллекция с парой ключ / значение, в которой ключ может встречаться более одного раза? - PullRequest
8 голосов
/ 03 марта 2011

Я хочу использовать общую коллекцию, например Dictionary, но Dictionary требует, чтобы каждый ключ был уникальным.У меня есть несколько значений для одного и того же «ключа», поэтому мне нужна общая коллекция, которая позволит это сделать.

Я понимаю, что это делает ключ больше не действительно ключом, но яне знаю как еще это назвать.

Ответы [ 6 ]

18 голосов
/ 03 марта 2011

Несколько вариантов для рассмотрения:

  • используйте Dictionary<TKey, List<TValue>> - сохраняйте список значений для каждого ключа, не предотвращая дублирование значенийдля одного и того же ключа (т. е. дублирующих пар);
  • используйте Dictionary<TKey, HashSet<TValue>> - сохраняйте набор значений для каждого ключа, предотвращая дублирование значений для одного и того же ключа;
  • используйте List<KeyValuePair<TKey, TValue>> - ведите список пар, не препятствуя дублированию значений для одного и того же ключа.

Обратите внимание, что в последнем случае KeyValuePair - это struct, а не class, следовательно, это предполагает несколько иную обработку.

Правильный вариант зависит от вашего фактического варианта использования.

8 голосов
/ 03 марта 2011

В .NET 3.5 и выше, то есть ILookup<TKey,TValue>. К сожалению, единственной предоставленной реализацией является неизменяемая Lookup<TKey,TValue>, однако ее легко реализовать повторно. EditableLookup<TKey,TValue> включено в MiscUtil .

При ILookup<TKey,TValue> индексатор TKey возвращает IEnumerable<TValue> (даже если для этого ключа не было совпадений), поэтому обычно используется:

foreach(var value in lookup[key])
    DoSomethingWith(value);
4 голосов
/ 03 марта 2011

В C ++ такая коллекция называется мультикартой.Быстрый поиск по этому термину выявил этот связанный вопрос:

мультикарта в .NET

2 голосов
/ 03 марта 2011

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

Тем не менее, если у вас есть IEnumerable, вы можете преобразовать его впоиск, который похож на то, что вы описали, но не может быть создан сам по себе (для вызова из перечисления необходимо вызвать ToLookup ()).

0 голосов
/ 03 марта 2011

Для вашего значения вы можете хранить список того, что хотите сохранить.

0 голосов
/ 03 марта 2011

Попробуйте Dictionary<KeyType,List<ValueType>>.

Вы можете создать собственный словарь, который обернет этот словарь для обработки всей необходимой логики при добавлении и удалении.

...