2009-09-30 57 views
34

Tengo una situación en el código donde un Dictionary<string, string> me pareció la mejor idea: necesito una colección de estos objetos y necesito que sean accesibles a través de una clave única. Exactamente para qué es el concepto de diccionario, ¿verdad?C# Diccionario con dos valores por clave?

Bueno, los requisitos se han ampliado hasta el punto en que ahora necesito tener un bit adicional de información por clave (un valor booleano, si tiene curiosidad).

Por lo tanto, me imagino expandir el concepto para crear una nueva estructura de datos con la cadena y el booleano y que ahora sea un Dictionary<string, NewCustomObject>.

Sin embargo, por solo un valor adicional como una bandera booleana, simplemente se siente como un exceso. Y, sin embargo, no conozco ningún objeto genérico parecido a un diccionario con dos valores por clave.

¿Acaso tener un diccionario de objetos personalizados es la mejor manera de hacerlo o hay algo más simple para este escenario?

+14

Su primera idea de Dictionary no es una exageración en absoluto. Expresa la intención exacta, está fuertemente tipado, habilitado para intellisense, acomodará fácilmente el próximo cambio en los requisitos. –

+1

@Oren Trutner: No puedo estar más de acuerdo. @Schnapple: no te molestes con un par, usa un objeto personalizado, con nombres bien definidos. Evite, por ejemplo, "Value1" y "Value2" para los nombres de los campos. Dales significado semántico. – Randolpho

+1

No hay nada que se acerque a la "exageración" al crear nuevas clases en un idioma de OO. Bueno, generalmente no lo hay, y en este caso no es así. –

Respuesta

29

En realidad, lo que acaba de describir es un uso ideal para la colección de diccionarios. Se supone que contiene clave: pares de valores, independientemente del tipo de valor. Al hacer que el valor sea de su propia clase, podrá ampliarlo fácilmente en el futuro, si fuera necesario.

+0

Terminé yendo por esta ruta ya que los otros parecían igual de complicados y está en .NET 3.5 así que no Tuples para mí –

+0

Decisión sabia :) –

2

¿Esto no funciona para ti?

Dictionary<string, List<string>> 

O usted podría utilizar un Tuple y tienen un diccionario de eso:

Dictionary<string, Tuple<string, bool>> 
+0

Entonces, ¿cómo almacena el booleano con esto? –

+0

O, de forma equivalente, 'System.Collections.Specialized.NameValueCollection'. –

+1

Ralph: respondí el título inicialmente. Se agregó una solución para ese caso. –

3

no creo NET tiene Multi-Mapa construida en que generalmente es una estructura de datos que puede utilizar para hacer este tipo de almacenamiento. Por otro lado, no creo que sea exagerado utilizar un objeto personalizado que contenga tanto una cadena como un booleano.

+0

Los mapas múltiples le permiten almacenar valores múltiples en una clave determinada, pero los valores son del mismo tipo y no se distinguen de ninguna otra manera, por lo que no se ajustaría a esta necesidad. –

15

La publicación del diccionario Multivalue podría servirle.

+8

Podría valer la pena solo para tener el código de Jon Skeet en mi aplicación :) –

+0

¡El ejemplo de Jon Skeet se adaptará perfectamente a esta necesidad y es genérico! –

7

Creo que en general te estás metiendo en el concepto de Tuples, algo así como Tuple<x, y, z>, o Tuple<string, bool, value>.

C# 4.0 tendrá soporte dinámico para tuplas, pero aparte de eso, debe hacer su propia transferencia o descargar una biblioteca Tuple.

You can see my answer here donde pongo un código de muestra para una clase de tupla genérica. O puedo volver a publicarlo aquí:

public class Tuple<T, T2, T3> 
{ 
    public Tuple(T first, T2 second, T3 third) 

    { 
     First = first; 
     Second = second; 
     Third = third; 
    } 

    public T First { get; set; } 
    public T2 Second { get; set; } 
    public T3 Third { get; set; } 

} 
4

En .NET4, podría utilizar (sin marcar): Dictionary<string, Tuple<bool,string>>

0

Un diccionario es sólo una colección de objetos con llave. Como tal, contendrá cualquier tipo de objeto que desee. Incluso el más simple de los objetos, como, por ejemplo, una matriz (que se deriva de Object), pero requiere mucho menos código en su nombre.

En lugar de escribir una clase completa, rellenar una matriz asignada dinámicamente, o una lista en el valor y ejecutar con eso.

Los diccionarios son muy flexibles de esta manera.

0

¿Qué pasa con Lookup clase?

Editar:

Después de leer la pregunta cuidadosamente pensar que esto no es la mejor solución, pero sigue siendo un buen año para el diccionario con algunos valores por una sola tecla.

11
class MappedValue 
{ 
    public string SomeString { get; set; } 
    public bool SomeBool { get; set; } 
} 

Dictionary<string, MappedValue> myList = new Dictionary<string, MappedValue>; 
0

Otra idea es almacenar el booleano en una estructura de datos separada, p. un HashSet.

1

Tuple es siempre una buena solución. Además, en un enfoque orientado a objetos, siempre favorece la composición sobre la herencia. Construye un objeto compuesto haciendo la agrupación. Simplemente. Creo que está cubierto con algunas soluciones buenas y limpias aquí, de otros stackoverflowers. :)

Cuestiones relacionadas