具有相同键的多个条目的字典[重复]
Posted
技术标签:
【中文标题】具有相同键的多个条目的字典[重复]【英文标题】:A dictionary with multiple entries with the same key [duplicate] 【发布时间】:2011-04-08 02:04:25 【问题描述】:我需要一个类似字典的对象,它可以使用相同的键存储多个条目。这是作为标准系列提供的,还是我需要自己推出?
为了澄清,我希望能够做这样的事情:
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
【问题讨论】:
您是否希望专门使用 int 作为密钥?如果一个字符串就足够了,那么 NameValueCollection 可能是有用的 - 可以将多个值分配给一个键 【参考方案1】:我建议这样做:
var dict = new Dictionary<int, HashSet<string>>();
dict.Add(1, new HashSet<string>() "first", "second" );
【讨论】:
非常聪明,聪明!!!【参考方案2】:在 .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
。
【讨论】:
来自文档:没有公共构造函数来创建 LookupDictionary<T,K>
不支持此类行为,并且基类库中没有提供此类行为的集合。最简单的方法是像这样构造一个复合数据结构:
var data = new Dictionary<int, List<string>>();
作为第二个参数,您应该使用提供您正在寻找的品质的集合,即稳定的订单⇒List<T>
,快速访问HashSet<T>
等。
【讨论】:
【参考方案4】:您要查找的实际上并不是传统意义上的字典(请参阅Associative Array)。
据我所知,框架中没有提供此功能的类(System.Linq.Lookup
不公开构造函数),但您可以自己创建一个实现 ILookup<TKey, TElement>
的类
【讨论】:
【参考方案5】:您也许可以在主键上使用字典,其中每个元素都是辅助键上的列表或其他集合。要将项目添加到您的数据结构中,请查看主键是否存在。如果没有,请使用您的值创建一个新的单项列表并将其存储在字典中。如果主键确实存在,请将您的值添加到字典中的列表中。
【讨论】:
【参考方案6】:你肯定想使用 NameValueCollection:
使用 System.Collections.Specialized;
NameValueCollection nvc = new NameValueCollection();
nvc.Add("pets", "Dog");
nvc.Add("pets", "Rabbit");
Console.WriteLine(nvc["pets"]);
//returns Dog,Rabbit
【讨论】:
以上是关于具有相同键的多个条目的字典[重复]的主要内容,如果未能解决你的问题,请参考以下文章