2011-03-02 13 views
8

Quiero usar una colección genérica como Dictionary, pero Dictionary requiere que cada clave sea única. Tengo varios valores para la misma "clave", por lo que necesito una colección genérica que permita eso.¿Hay una colección genérica con un par clave/valor donde la clave puede aparecer más de una vez?

Me doy cuenta de que esto hace que la clave ya no sea realmente una clave, pero no sé cómo llamarla.

+1

Para cualquier persona que cuida, me acabé incluyendo una referencia a el valor que quería rastrear dentro del objeto de valor. Luego acabo de usar una lista y pude acceder al valor a través de la propiedad de mi objeto. Gracias a todos los que contestaron. Usaré esta información para usarla en el futuro. – richard

+0

posible duplicado de [¿Duplicar claves en diccionarios .NET?] (Http://stackoverflow.com/questions/146204/duplicate-keys-in-net-dictionaries) – nawfal

Respuesta

16

varias opciones para que usted considere:

  • utilizar un Dictionary<TKey, List<TValue>> - mantener una lista de valores para cada uno clave, no previene valores duplicados de para la misma clave (es decir, pares duplicados);
  • uso de un Dictionary<TKey, HashSet<TValue>> - llevar un establece de valor para cada tecla, prevención de valores duplicados para la misma clave;
  • utilice un List<KeyValuePair<TKey, TValue>> - mantenga una lista de pares, , evitando valores duplicados para la misma clave.

Tenga en cuenta que en este último caso KeyValuePair es una struct, no un class, por lo tanto, que implica un manejo poco diferente.

La opción correcta depende de su caso de uso real.

+0

Creo que su segunda sugerencia tiene más sentido para mí. Me permitiría iterar sobre las claves y obtener los valores, pero no necesitaría que las claves fueran únicas en toda la colección. ¿Es eso correcto? – richard

+0

Sí, eso es correcto. También tenga en cuenta que no impedirá que se almacenen pares duplicados. Si eso es una preocupación, el primer enfoque con un 'HashSet' sería mejor. (Editado mi respuesta para cubrir eso.) –

+1

¡Buena respuesta! :-) –

0

Probar Dictionary<KeyType,List<ValueType>>.

Puede crear un diccionario personalizado que ajuste este diccionario para manejar toda la lógica requerida al agregar y eliminar.

+0

El diccionario requerirá que _KeyType_ sea único. Quiero usar el mismo valor para la clave más de una vez. – richard

2

Puede crear un Dictionary<TKey,List<TValue>> y hacer el trabajo manual usted mismo, pero no hay una colección "multi-diccionario" por defecto.

Dicho esto, si tiene un IEnumerable puede convertirlo en una búsqueda que es como la que describió, pero no puede construirse por sí mismo (tiene que llamar a ToLookup() para crear a partir de la enumeración).

0

Para su valor, puede almacenar una lista de lo que sea que desee conservar.

4

En C++, dicha colección se denomina multimap. Una búsqueda rápida para ese término reveló esta pregunta relacionada:

multimap in .NET

8

En .NET 3.5 y superior, es decir ILookup<TKey,TValue>. Lamentablemente, la única implementación de es la inmutable Lookup<TKey,TValue>, sin embargo, es fácil volver a implementarla. Se incluye EditableLookup<TKey,TValue> en MiscUtil.

Con una ILookup<TKey,TValue>, la TKey indexador devuelve un IEnumerable<TValue> (incluso si no hubo resultados para esa clave), así que el uso típico es:

foreach(var value in lookup[key]) 
    DoSomethingWith(value); 
Cuestiones relacionadas