具有相同键的多个条目的字典

时间:2010-09-03 22:22:57

标签: c# collections

我需要一个类似于Dictionary的对象,它可以存储具有相同键的多个条目。这可以作为标准集合,还是我需要自己动手?

为了澄清,我希望能够做到这样的事情:

var dict = new Dictionary<int, String>();
dict.Add(1, "first");
dict.Add(1, "second");

foreach(string x in dict[1])
{
    Console.WriteLine(x);
}

输出:

first
second

6 个答案:

答案 0 :(得分:46)

在.NET 3.5中,您可以使用Lookup而不是词典。

var items = new List<KeyValuePair<int, String>>();
items.Add(new KeyValuePair<int, String>(1, "first"));
items.Add(new KeyValuePair<int, String>(1, "second"));
var lookup = items.ToLookup(kvp => kvp.Key, kvp => kvp.Value);

foreach (string x in lookup[1])
{
    Console.WriteLine(x);
}

Lookup类是不可变的。如果您想要一个可变版本,可以使用MiscUtil中的EditableLookup

答案 1 :(得分:11)

我建议做这样的事情:

var dict = new Dictionary<int, HashSet<string>>();
dict.Add(1, new HashSet<string>() { "first", "second" });

答案 2 :(得分:7)

Dictionary<T,K>不支持此类行为,并且基类库中没有提供此类行为的集合。最简单的方法是构造一个这样的复合数据结构:

var data = new Dictionary<int, List<string>>();

作为第二个参数,你应该使用一个提供你正在寻找的品质的集合,即稳定的订单⇒List<T>,快速访问HashSet<T>等。

答案 3 :(得分:4)

你肯定想使用NameValueCollection:

使用System.Collections.Specialized;

NameValueCollection nvc = new NameValueCollection();
nvc.Add("pets", "Dog");
nvc.Add("pets", "Rabbit");
Console.WriteLine(nvc["pets"]);
//returns Dog,Rabbit

答案 4 :(得分:1)

你所寻找的实际上并不是传统意义上的词典(见Associative Array)。

据我所知,没有类在框架中提供此类(System.Linq.Lookup不公开构造函数),但您可以自己创建一个实现ILookup<TKey, TElement> <的类/ p>

答案 5 :(得分:0)

您可以在主键上使用词典,其中每个元素都是辅助键上的List或其他集合。要将项添加到数据结构,请查看主键是否存在。如果没有,请使用您的Value创建一个新的单项列表,并将其存储在字典中。如果主键确实存在,请将您的值添加到字典中的列表。