Как создать многозначный словарь в С#?
например. Dictionary<T,T,T>
, где первый Т - это ключ, а остальные два - значения.
чтобы это было возможно: Dictionary<int,object,double>
Спасибо
Как создать многозначный словарь в С#?
например. Dictionary<T,T,T>
, где первый Т - это ключ, а остальные два - значения.
чтобы это было возможно: Dictionary<int,object,double>
Спасибо
Просто создайте тип Pair<TFirst, TSecond>
и используйте это как свое значение.
У меня есть пример одного из С# в исходном коде глубины. Воспроизведено здесь для простоты:
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);
}
}
Если вы пытаетесь группировать значения вместе, это может быть отличной возможностью создать простую структуру или класс и использовать это как значение в словаре.
public struct MyValue
{
public object Value1;
public double Value2;
}
тогда у вас может быть ваш словарь
var dict = new Dictionary<int, MyValue>();
вы даже можете пойти дальше и реализовать свой собственный класс словаря, который будет обрабатывать любые специальные операции, которые вам понадобятся. например, если вы хотите иметь метод Add, который принял int, object и 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);
}
}
тогда вы можете просто создать экземпляр и добавить в словарь так, и вам не придется беспокоиться о создании структур MyValue:
var dict = new MyDictionary();
dict.Add(1, new Object(), 2.22);
Dictionary<T1, Tuple<T2, T3>>
Изменить: Извините - я забыл, что вы не получаете Tuples, пока .NET 4.0 не выйдет. D'о!
Я думаю, что это довольно переполняет семантику словаря, поскольку словарь по определению представляет собой набор ключей и его соответствующих значений, точно так же, как мы видим книгу словарного словаря, содержащую слово в качестве ключа и его описательную значение как значение.
Но вы можете представить словарь, который может содержать набор значений, например:
Dictionary<String,List<Customer>>
Или словарь ключа и значение как словарь:
Dictionary<Customer,Dictionary<Order,OrderDetail>>
Тогда у вас будет словарь, который может иметь несколько значений.
Я не думаю, что вы можете сделать это напрямую. Вы можете создать класс, содержащий как object
, так и double
, и поместить его в словарь.
class Pair
{
object obj;
double dbl;
}
Dictionary<int, Pair> = new Dictionary<int, Pair>();
Если значения связаны друг с другом, почему бы не инкапсулировать их в класс и просто использовать простой старый словарь?
Вы описываете multimap.
Вы можете сделать значение объектом List, чтобы сохранить более одного значения ( > 2 для расширяемости).
Переместить объект словаря.
Я решил использовать:
Dictionary<short, string[]>
Подобно этому
Dictionary<short, string[]> result = new Dictionary<short, string[]>();
result.Add(1,
new string[]
{
"FirstString",
"Second"
}
);
}
return result;