Многозначный словарь - PullRequest
70 голосов
/ 20 февраля 2009

Как создать словарь с несколькими значениями в c #?

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

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

Спасибо

Ответы [ 9 ]

60 голосов
/ 20 февраля 2009

Просто создайте тип Pair<TFirst, TSecond> и используйте его в качестве значения.

У меня есть пример одного в моем C # в исходном коде Depth . Воспроизведено здесь для простоты:

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);
    }
}
51 голосов
/ 20 февраля 2009

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

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);
26 голосов
/ 20 февраля 2009
Dictionary<T1, Tuple<T2, T3>>

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

6 голосов
/ 20 февраля 2009

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

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

Dictionary<String,List<Customer>>

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

Dictionary<Customer,Dictionary<Order,OrderDetail>>

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

4 голосов
/ 20 февраля 2009

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

class Pair
{
    object obj;
    double dbl;
}

Dictionary<int, Pair> = new Dictionary<int, Pair>();
2 голосов
/ 20 февраля 2009

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

1 голос
/ 12 января 2017

Я решил, используя:

Dictionary<short, string[]>

Как это

Dictionary<short, string[]> result = new Dictionary<short, string[]>();
result.Add(1,
           new string[] 
                    { 
                    "FirstString",
                    "Second"
                    }
                );
        }
return result;
1 голос
/ 20 февраля 2009

Вы описываете мультикарту.

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

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

0 голосов
/ 31 мая 2018

Я знаю, что это старая ветка, но - поскольку она не упоминалась, это работает

  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);          
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...