Как инициализировать словарь как пара (ключ, значение, значение) в C # - PullRequest
11 голосов
/ 04 декабря 2009

Я хочу сохранить значения как ключ, значение, пару значений. Мои данные имеют тип

Key -> int & both values -> ulong,

Как инициализировать и получить значения такого словаря. Я использую VS-2005.

Если я использую класс или структуру, то как мне получить значения.

Ответы [ 9 ]

17 голосов
/ 04 декабря 2009

Создать структуру для хранения ваших значений:

struct ValuePair
{
    public ulong Value1;
    public ulong Value2;
}

Инициализация словаря:

Dictionary<int, ValuePair> dictionary = new Dictionary<int, ValuePair>();

Может быть, List достаточно, если вы используете int в качестве ключа?

Список:

List<ValuePair> list = new List<ValuePair>();

ValuePair можно добавить к list следующим образом:

list.Add(new ValuePair { Value1 = 1, Value2 = 2 });
14 голосов
/ 04 декабря 2009

Вы можете объявить класс, который хранит оба значения, а затем использовать обычный словарь. Например:

class Values {
    ulong Value1 {get;set;}
    ulong Value2 {get;set;}
}

var theDictionary=new Dictionary<int, Values>;

theDictionary.Add(1, new Values {Value1=2, Value2=3});
9 голосов
/ 04 декабря 2009

Это будет вариант:

Dictionary<int, KeyValuePair<ulong, ulong>> dictionary = new Dictionary<int, KeyValuePair<ulong, ulong>>();

Если вы хотите добавить значение: Key = 1, Pair = {2,3}

dictionary.Add(1, new KeyValuePair<ulong, ulong>(2, 3));

Если вы хотите получить эти значения:

var valuePair = dictionary[1];
ulong value1 = valuePair.Key;
ulong value2 = valuePair.Value;

Или просто:

ulong value1 = dictionary[1].Key;
6 голосов
/ 04 декабря 2009

Создайте класс Tuple в пространстве имен System:

public class Tuple<T1,T2>
{
    private readonly T1 _item1;
    private readonly T2 _item2;

    public Tuple(T1 item1, T2 item2)
    {
        this._item1 = item1;
        this._item2 = item2;
    }

    public T1 Item1 { get { return _item1; } }

    public T2 Item2 { get { return _item2; } }
}

И статический класс Tuple с методом Create, так что вы получаете вывод типа, который недоступен для конструкторов:

public static class Tuple
{
    public static Tuple<T1, T2> Create<T1, T2>(T1 item1, T2 item2)
    {
        return new Tuple<T1, T2>(item1, item2);
    }
}

Затем, когда вы попадаете на .NET 4.0, вы можете удалить эти классы, поскольку они находятся в библиотеке базовых классов (и совместимы с кортежами F #!).

1 голос
/ 04 декабря 2009

В C # 4 у вас будет тип кортежа для вашего значения, пары значений.

В статье MSDN описывается тип и проектные решения, стоящие за ним.

1 голос
/ 04 декабря 2009

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

var dic = new Dictionary<int,KeyValuePair<ulong,ulong>>();

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

dic.Add(42, new KeyValuePair<ulong, ulong>(42, 42));
dic.Add(43, new KeyValuePair<ulong, ulong>(43, 43));

И получить значения следующим образом:

foreach (var a in dic)
{
    Console.WriteLine("Key: {0}, Value1: {1}, Value2: {2}",
        a.Key, a.Value.Key, a.Value.Value);
}
0 голосов
/ 04 декабря 2009

Посмотрите на Пространство имен Wintellect.PowerCollections у них есть специальная структура Pair <(Of) и коллекции для работы с ним, или вам придется кодировать свой собственный тип Pair. </p>

0 голосов
/ 04 декабря 2009

Вы можете использовать KeyValuePair

Dictionary<int, KeyValuePair<ulong,ulong>> vals = new Dictionary<int, KeyValuePair<ulong, ulong>>();
0 голосов
/ 04 декабря 2009

возможно, вам нужно определить класс, скажем, класс Pair, для хранения ваших двух значений и использовать int в качестве ключа.

...