【问题标题】: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 可能是有用的 - 可以将多个值分配给一个键

标签: c# collections


【解决方案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 类是不可变的。如果您想要一个可变版本,您可以使用来自MiscUtilEditableLookup

【讨论】:

  • 来自文档:没有公共构造函数来创建 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
        

        【讨论】:

          猜你喜欢
          • 2019-06-09
          • 1970-01-01
          • 2014-04-27
          • 1970-01-01
          • 2011-07-15
          • 1970-01-01
          • 2021-12-07
          • 2018-09-28
          • 2021-05-24
          相关资源
          最近更新 更多