我需要一个类似于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
答案 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创建一个新的单项列表,并将其存储在字典中。如果主键确实存在,请将您的值添加到字典中的列表。