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!