ti-enxame.com

Um dicionário com várias entradas com a mesma chave

Eu preciso de um dicionário como objeto que pode armazenar várias entradas com a mesma chave. Isso está disponível como uma coleção padrão ou preciso fazer o meu próprio?

Para esclarecer, quero poder fazer algo assim:

var dict = new Dictionary<int, String>();
dict.Add(1, "first");
dict.Add(1, "second");

foreach(string x in dict[1])
{
    Console.WriteLine(x);
}

Resultado:

first
second
30
oillio

No .NET 3.5, você pode usar um Pesquisa em vez de um Dicionário.

var items = new List<KeyValuePair<int, String>>();
items.Add(new KeyValuePair<int, String>(1, "first"));
items.Add(new KeyValuePair<int, String>(1, "second"));
var lookup = items.ToLookup(kvp => kvp.Key, kvp => kvp.Value);

foreach (string x in lookup[1])
{
    Console.WriteLine(x);
}

A classe Lookup é imutável. Se você deseja uma versão mutável, pode usar EditableLookup de MiscUtil .

46
Mark Byers

Eu recomendaria fazer algo assim:

var dict = new Dictionary<int, HashSet<string>>();
dict.Add(1, new HashSet<string>() { "first", "second" });
11
ChaosPandion

Dictionary<T,K> não suporta esse comportamento e não há coleção na biblioteca de classes base que forneça esse comportamento. A maneira mais fácil é construir uma estrutura de dados composta como esta:

var data = new Dictionary<int, List<string>>();

Como segundo parâmetro, você deve usar uma coleção que forneça as qualidades que você procura, ou seja, ordem estável ⇒ List<T>, acesso rápido HashSet<T>, etc.

7
Ondrej Tucny

Você definitivamente quer usar NameValueCollection:

using System.Collections.Specialized;

NameValueCollection nvc = new NameValueCollection();
nvc.Add("pets", "Dog");
nvc.Add("pets", "Rabbit");
Console.WriteLine(nvc["pets"]);
//returns Dog,Rabbit
4
Amit

O que você está procurando não é realmente um dicionário no sentido tradicional (consulte Matriz associativa ).

Até onde eu sei, não há nenhuma classe que ofereça isso na estrutura (System.Linq.Lookup não expõe um construtor), mas você mesmo pode criar uma classe que implementa ILookup<TKey, TElement>

1
Rob

Talvez você possa usar um Dicionário na sua chave primária, no qual cada elemento é uma Lista ou outra coleção na sua chave secundária. Para adicionar um item à sua estrutura de dados, verifique se a chave primária existe. Caso contrário, crie uma nova lista de item único com o seu Valor e armazene-a no dicionário. Se a chave primária existir, adicione seu Valor à lista que está no dicionário.

0
supercat