2010-04-19 7 views
13

¿Cuál sería la mejor estructura de datos de C# para usar una clave y tener dos valores extraídos?Diccionario de C#, 2 valores

Esencialmente necesito un Dictionary<string, string, string>. ¿Hay algo como esto?

Respuesta

21

Si está utilizando .NET 4, se puede usar

Dictionary<string, Tuple<string, string>> 

Si usted no es, usted podría crear su propia Tuple tipo que funciona de la misma manera :)

Alternativamente, si solo necesita esto en un lugar, puede crear su propio tipo que encapsule las dos cadenas cuidadosamente usando nombres apropiados. Por ejemplo:

public sealed class NameAndAddress 
{ 
    private readonly string name; 
    public string Name { get { return name; } } 

    private readonly string address; 
    public string Address { get { return address; } } 

    public NameAndAddress(string name, string address) 
    { 
     this.name = name; 
     this.address = address; 
    } 
} 

continuación, puede utilizar:

Dictionary<string, NameAndAddress> 

que hace que sea muy claro lo que va a ser almacenado.

Puede implementar la igualdad, etc., si así lo desea. Personalmente me gustaría ver este tipo de cosas hace más fácil - los tipos anónimos casi hacerlo, pero entonces no puedo nombrarlos ...

+2

Ooh tuple ....! –

+0

Sellado, solo de lectura, propiedades, ... - no lo confundas;) – Danvil

+1

Sellado, solo lectura, propiedades, ... - uno de los ejemplos inmutables más concisos que he visto. Pero, ¿qué hay de reemplazar a Equals y GetHashCode? :) –

6
class A { 
    public string X, Y; 
} 

Dictionary<string, A> data; 
3

Crear una estructura que contiene sus valores y luego usar

Dictionary<string, MyStruct> dict = new Dictionary<string, MyStruct>(); 
0

puede utilizar un diccionario de KeyValuePairs

Dictionary<string,KeyValuePair<string,string>> 
+3

No me gusta esta idea, ya que aunque * hará * lo que quieras, es engañosa: ¿por qué la segunda cadena se ve como una clave para el tercero? –

+0

Sí, tiene razón, pero en algunas situaciones esa es una solución rápida y no tan fea ... De todos modos, una implementación personalizada o el uso de Tuple es probablemente el mejor en general (pero Tuple solo está en .NET 4.0) – digEmAll

+0

-1 Esto es muy engañoso. No hay lógica en lo que debería ser una clave y lo que debería ser un valor en KeyValuePair

0

Sí, hay exactly that. Puede almacenar sus dos valores en una clase o estructura. ¿O quieres algo más?

0

Haz una clase para mantener tu valor y convertirlo en un diccionario. Si la clase solo se utiliza en el contexto de una clase que contiene (por ejemplo, se utiliza para entregar una estructura de datos para una propiedad de clase), puede hacer que su clase sea una clase anidada privada.

Cuestiones relacionadas