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

oil*_*lio 31 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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

first
second
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 46

在.NET 3.5中,您可以使用Lookup而不是Dictionary.

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);
}
Run Code Online (Sandbox Code Playgroud)

这个Lookup类是不可变的.如果你想要一个可变的版本,你可以使用EditableLookupMiscUtil.


Cha*_*ion 11

我建议做这样的事情:

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


Ond*_*cny 7

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

var data = new Dictionary<int, List<string>>();
Run Code Online (Sandbox Code Playgroud)

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


小智 7

你肯定想使用 NameValueCollection:

使用 System.Collections.Specialized;

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