Подтвердить что ты не робот

Многозначный словарь

Как создать многозначный словарь в С#?

например. Dictionary<T,T,T>, где первый Т - это ключ, а остальные два - значения.

чтобы это было возможно: Dictionary<int,object,double>

Спасибо

4b9b3361

Ответ 1

Просто создайте тип 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);
    }
}

Ответ 2

Если вы пытаетесь группировать значения вместе, это может быть отличной возможностью создать простую структуру или класс и использовать это как значение в словаре.

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);

Ответ 3

Dictionary<T1, Tuple<T2, T3>>

Изменить: Извините - я забыл, что вы не получаете Tuples, пока .NET 4.0 не выйдет. D'о!

Ответ 4

Я думаю, что это довольно переполняет семантику словаря, поскольку словарь по определению представляет собой набор ключей и его соответствующих значений, точно так же, как мы видим книгу словарного словаря, содержащую слово в качестве ключа и его описательную значение как значение.

Но вы можете представить словарь, который может содержать набор значений, например:

Dictionary<String,List<Customer>>

Или словарь ключа и значение как словарь:

Dictionary<Customer,Dictionary<Order,OrderDetail>>

Тогда у вас будет словарь, который может иметь несколько значений.

Ответ 5

Я не думаю, что вы можете сделать это напрямую. Вы можете создать класс, содержащий как object, так и double, и поместить его в словарь.

class Pair
{
    object obj;
    double dbl;
}

Dictionary<int, Pair> = new Dictionary<int, Pair>();

Ответ 6

Если значения связаны друг с другом, почему бы не инкапсулировать их в класс и просто использовать простой старый словарь?

Ответ 7

Вы описываете multimap.

Вы можете сделать значение объектом List, чтобы сохранить более одного значения ( > 2 для расширяемости).

Переместить объект словаря.

Ответ 8

Я решил использовать:

Dictionary<short, string[]>

Подобно этому

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