具有相同键的多个条目的字典[重复]

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

【讨论】:

来自文档:没有公共构造函数来创建 Lookup 的新实例。此外,Lookup 对象是不可变的,也就是说,您不能在 Lookup 对象创建后添加或删除元素或键。 @Douglas:感谢您的评论。我已经更新了我的答案以涵盖这一点。【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

您要查找的实际上并不是传统意义上的字典(请参阅Associative Array)。

据我所知,框架中没有提供此功能的类(System.Linq.Lookup 不公开构造函数),但您可以自己创建一个实现 ILookup&lt;TKey, TElement&gt; 的类

【讨论】:

【参考方案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

【讨论】:

以上是关于具有相同键的多个条目的字典[重复]的主要内容,如果未能解决你的问题,请参考以下文章

具有多个值的C#字典如何[重复]

具有重复键的字典 [重复]

具有相同键的(嵌套)字典的 Pythonic 替代方案?

服务器与本地机器上dict键的随机顺序[重复]

将具有重复键的 2 个字典与 linq 合并

在字典中查找重复值并打印重复元素的键