c#

c# - Diccionario de valores mĂșltiples



(9)

¿Cómo crearía un diccionario multivalor en c #?

Ej. Dictionary<T,T,T> donde el primer T es la clave y otros dos son valores.

entonces esto sería posible: Dictionary<int,object,double>

Gracias


Creo que esto es bastante exagerado para una semántica del diccionario, ya que el diccionario es, por definición, una colección de claves y sus valores respectivos, al igual que la forma en que vemos un libro del diccionario de idiomas que contiene una palabra como clave y su significado descriptivo como valor.

Pero puede representar un diccionario que puede contener una colección de valores, por ejemplo:

Dictionary<String,List<Customer>>

O un diccionario de una clave y el valor como un diccionario:

Dictionary<Customer,Dictionary<Order,OrderDetail>>

Entonces tendrás un diccionario que puede tener múltiples valores.


Lo solucioné usando:

Dictionary<short, string[]>

Me gusta esto

Dictionary<short, string[]> result = new Dictionary<short, string[]>(); result.Add(1, new string[] { "FirstString", "Second" } ); } return result;


No creo que puedas hacer eso directamente. Podrías crear una clase que contenga tanto tu object como el double y poner una instancia del mismo en el diccionario.

class Pair { object obj; double dbl; } Dictionary<int, Pair> = new Dictionary<int, Pair>();


Sé que este es un hilo viejo, pero, como no se ha mencionado, funciona

Dictionary<string, object> LookUp = new Dictionary<string, object>(); LookUp.Add("bob", new { age = "23", height = "2.1m", weight = "110kg"}); LookUp.Add("jasper", new { age = "33", height = "1.75m", weight = "90kg"}); foreach(KeyValuePair<string, object> entry in LookUp ) { object person = entry.Value; Console.WriteLine("Person name:" + entry.Key + " Age: " + person.age); }


Si intenta agrupar valores, esta puede ser una gran oportunidad para crear una estructura o clase simple y usarla como valor en un diccionario.

public struct MyValue { public object Value1; public double Value2; }

entonces podrías tener tu diccionario

var dict = new Dictionary<int, MyValue>();

incluso podría ir un paso más allá e implementar su propia clase de diccionario que manejará cualquier operación especial que necesite. por ejemplo, si desea tener un método Add que acepte un int, un objeto y un double

public class MyDictionary : Dictionary<int, MyValue> { public void Add(int key, object value1, double value2) { MyValue val; val.Value1 = value1; val.Value2 = value2; this.Add(key, val); } }

entonces simplemente podría crear instancias y agregar al diccionario como tal y no tendría que preocuparse por crear estructuras ''MyValue'':

var dict = new MyDictionary(); dict.Add(1, new Object(), 2.22);


Si los valores están relacionados, ¿por qué no los encapsula en una clase y simplemente utiliza el viejo diccionario simple?


Simplemente cree un tipo Pair<TFirst, TSecond> y utilícelo como su valor.

Tengo un ejemplo de uno en mi código fuente C # en profundidad . Reproducido aquí por simplicidad:

using System; using System.Collections.Generic; public sealed class Pair<TFirst, TSecond> : IEquatable<Pair<TFirst, TSecond>> { private readonly TFirst first; private readonly TSecond second; public Pair(TFirst first, TSecond second) { this.first = first; this.second = second; } public TFirst First { get { return first; } } public TSecond Second { get { return second; } } public bool Equals(Pair<TFirst, TSecond> other) { if (other == null) { return false; } return EqualityComparer<TFirst>.Default.Equals(this.First, other.First) && EqualityComparer<TSecond>.Default.Equals(this.Second, other.Second); } public override bool Equals(object o) { return Equals(o as Pair<TFirst, TSecond>); } public override int GetHashCode() { return EqualityComparer<TFirst>.Default.GetHashCode(first) * 37 + EqualityComparer<TSecond>.Default.GetHashCode(second); } }


Usted describe un multimap.

Puede hacer que el valor sea un objeto List, para almacenar más de un valor (> 2 para la extensibilidad).

Anular el objeto de diccionario.


Dictionary<T1, Tuple<T2, T3>>

Editar: Lo siento, olvidé que no obtienes Tuples hasta que aparezca .NET 4.0. D''oh!