как инициализировать словарь как пару (ключ, значение, значение) в C#
Я хочу хранить значения как пару ключ, значение, значение. Мои данные имеют тип
Key -> int & both values -> ulong,
как инициализировать и извлекать значения такого словаря. Я использую VS-2005.
Если я использую класс или структуру, то как мне получить значения.
9 ответов
создать структуру для хранения ваших ценностей:
struct ValuePair
{
public ulong Value1;
public ulong Value2;
}
инициализация словаря:
Dictionary<int, ValuePair> dictionary = new Dictionary<int, ValuePair>();
может быть, достаточно списка, если вы используете int в качестве ключа?
список:
List<ValuePair> list = new List<ValuePair>();
ValuePair
можно добавить в list
следующим образом:
list.Add(new ValuePair { Value1 = 1, Value2 = 2 });
можно объявить класс, который хранит оба значения, а затем использовать обычный словарь. Например:
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});
это будет вариант:
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;
создайте класс кортежа в пространстве имен 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; } }
}
и статический класс кортежа с методом 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#!).
Я не уверен, что правильно понял ваш вопрос, но если вы хотите сохранить более одного значения в части значения словаря, вы можете сделать что-то вроде этого:
var dic = new Dictionary<int,KeyValuePair<ulong,ulong>>();
вы можете использовать insert в словаре следующим образом:
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);
}
В C# 4 у вас будет тип кортежа для вашего значения, пары значений.
здесь статья MSDN описание типа и проектных решений за ним.
возможно, вам нужно определить класс, скажем, пару классов, чтобы сохранить два значения и использовать int в качестве ключа.
вы можете использовать KeyValuePair
Dictionary<int, KeyValuePair<ulong,ulong>> vals = new Dictionary<int, KeyValuePair<ulong, ulong>>();
посмотреть Wintellect.Пространство Имен PowerCollections у них есть специальная структура Pair