2011-07-15 22 views
5

Estoy usando un diccionario C#.C# diccionario con múltiples valores por clave

Dictionary<int, string> d = new Dictionary<int, string>(); 

estoy usando el diccionario como entonces yo puedo tener el valor de clave único y que es impuesta por el Diccionario.

El valor de la clave será int. Antes tenía la necesidad de un solo valor. Ahora las cosas se han expandido a donde necesito almacenar múltiples valores (con diferentes tipos de datos) para la misma clave.

Algo como esto - (a pesar de que no va a funcionar):

Dictionary<int,string,string,bool, bool,int,bool> d = new Dictionary<int, string,string,bool, bool,int,bool>(); 

Tenga en cuenta que, string, int, bool, int, bool son valores adicionales que me gustan de almacenar para el campo clave que será un int.

No estoy seguro de cómo voy a hacer esto. ¿Cómo puedo obtener un valor clave para almacenar múltiples valores con diferentes tipos de datos? En la forma en que veo que esto es posible es almacenar los campos adicionales en una lista, pero no estoy seguro de cómo se combinarán. Si alguien puede proporcionar un ejemplo que sería apreciado.

Gracias de antemano.

Respuesta

11

Puede usar un Tuple como tipo genérico para el valor.

var d = new Dictionary<int,Tuple<string,string,bool, bool,int,bool>>(); 

otra parte, crear un tipo (clase o estructura) que contiene los diferentes tipos como grupo - lo más probable es que esta sería una mejor forma de modelar cosas.

+0

+1 simplemente porque es sexy y nunca lo había visto antes. –

+8

Te advierto sobre el uso de la tupla, porque mientras tecleas bien, no tienes contexto para lo que * significan los valores *. En este caso, elevaría la sugerencia de clase encapsulante de ser la alternativa a ser la respuesta principal , como lo ha hecho @spender. –

+0

Estoy de acuerdo con @AnthonyPegram, por favor no use un Tuple. Las tuplas de IMO son simplemente pereza por parte del desarrollador. Las clases son seguras y seguras de contexto. – Neil

15

Cree un tipo de datos personalizado con los campos que son string, string, bool, bool, int, bool y utilícelo como valor del diccionario.

class MyType 
{ 
    public string SomeVal1{ get; set; } 
    public string SomeVal2{ get; set; } 
    public bool SomeVal3{ get; set; } 
    public bool SomeVal4{ get; set; } 
    public int SomeVal5{ get; set; } 
    public bool SomeVal6{ get; set; } 
} 

continuación

var someDictionary = new Dictionary<int, MyType>(); 

y

someDictionary.Add(1, 
        new MyType{ 
         SomeVal1 = "foo", 
         SomeVal2 = "bar", 
         SomeVal3 = true, 
         SomeVal4 = false, 
         SomeVal5 = 42, 
         SomeVal6 = true 
        }); 
0

Lo único que a todo lo frikis aquí dijeron que puedo agregar, creo que deberías hacerlo a encapsulado ese diccionario en alguna clase, para que el usuario de esa envoltura de diccionario nunca se dé cuenta de lo que está sucediendo debajo de las capuchas, y implemente dentro de esa clase su lógica de recuperación preferida, o una de las enumeradas aquí.

+0

Sugeriría una estructura sobre una clase, ya que no contendrá ningún método y, por lo tanto, es mejor utilizar un tipo de valor que de referencia, que está en el montón y requiere un esfuerzo de recolección de basura para liberar la memoria, después de que se elimine de. Ciertamente no usaría un Tuple. De hecho, creo que usar una Tuple es una práctica tan mala como usar var para los tipos con nombre. –

0

Los diccionarios son key/value emparejamientos. Donde una clave corresponde a un valor. Sin embargo, el valor puede ser cualquier objeto, por lo que puede crear un objeto que contenga todos los miembros que desee. Considere lo siguiente:

var d = new Dictionary<int, string, string, bool, bool, int, bool>(); 

El consumidor de este diccionario no tiene idea de lo que estos tipos de datos primitivos pretende representar. Debe crear un objeto:

public class Person : IPerson 
{ 
    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public bool IsMarried { get; set; } 
    public bool HasChildren { get; set; }   
    public bool IsHappy { get; set; } 

    public Person(int id) 
    { 
     Id = id; 
    } 
} 

Obviamente este objeto está hecha con el propósito de hacer coincidir los tipos y representar los datos en un recipiente.Con este entendimiento, podría hacer lo siguiente:

var d = new Dictionary<int, IPerson>(); 
Cuestiones relacionadas