如何在C#中将字典初始化为(key, value, value)对

13

我想将值存储为键、值、值的形式。我的数据类型是

Key -> int & both values -> ulong,

如何初始化并提取这种字典的值。 我正在使用VS-2005。

如果我使用类或结构体,则如何提取值。

9个回答

21
创建一个结构体来存储你的值:
struct ValuePair
{
    public ulong Value1;
    public ulong Value2;
}

字典的初始化:

Dictionary<int, ValuePair> dictionary = new Dictionary<int, ValuePair>();
也许使用列表(List)作为键使用整数就足够了吗?
列表(List):
List<ValuePair> list = new List<ValuePair>();

可以按照以下方式将ValuePair添加到list中:

list.Add(new ValuePair { Value1 = 1, Value2 = 2 });

我该如何将值添加到列表中? - Nosheen Javed
1
@NosheenJaved list.Add(new ValuePair { Value1 = 1, Value2 = 2 }); - bniwredyc
@bniwredyc 简单而强大..谢谢 - SaiKiran Mandhala

14
您可以声明一个既存储值又使用普通字典的类。例如:
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});

4
你可以将Values改为结构体。 - Yann Schwartz
2
最好使用KeyValuePair而不是自定义类,或者至少使用结构体。 - Sune Rievers
1
一个结构体可以节省一些空间,并且更符合惯用语,但是差异很小并不是很重要。 - Daniel Goldberg
6
两个无符号长整型的长度为16字节,因此,这是结构体适用的罕见情况之一。至于KeyValuePair,除非确实打算将这两个值用作键和值以使代码更易理解,否则我不会使用它。 - Konamiman
"var theDictionary" 语法是什么意思?这种写法是否被允许? - jayarjo

12

这是一个选项:

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;

2
我更喜欢Konamiman的方法,因为它更简洁,但是不用新建一个类也可以这样做。 - naspinski
但是我该如何对其进行初始化呢?请提供一些获取代码 :) - Royson
1
naspinski,这似乎是在重新发明轮子,你觉得呢? - Adriaan Stander
2
从语义上讲,KeyValuePair 由一个 和一个 组成。OP 想要存储 两个值,因此虽然 KeyValuePair 可以解决问题,但它并不是一个很好的“语义”匹配。 - LukeH
1
并不是要重新发明轮子,只是采用了不同的方法 - 只是坚持使用基本的 .Net 类型 - 就像我说的,我个人会选择一个新的类,但是 OP 要求使用字典。 - naspinski
显示剩余4条评论

6
创建一个元组类,在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#元组兼容!)。


1

我不确定我正确理解了你的问题,但如果你想在字典的值部分存储多个值,你可以这样做:

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

从语义上讲,KeyValuePair 由一个 和一个 组成。OP 想要存储 两个值,所以虽然 KeyValuePair 可以实现这个目的,但它不是一个很好的“语义”匹配。 - LukeH
没错,但我仍然更喜欢这个解决方案,而不是为这个特定任务编写一个自定义结构。 - Sune Rievers

1
在C# 4中,您将拥有元组类型来表示您的值、值对。
有一篇MSDN文章描述了该类型及其背后的设计决策。

0

您可以使用KeyValuePair

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

0
也许你需要定义一个类,比如Pair类来保存你的两个值,并使用int作为键。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接