代码之家  ›  专栏  ›  技术社区  ›  oillio

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

  •  30
  • oillio  · 技术社区  · 16 年前

    这个问题已经有了答案:

    我需要一个类似字典的对象,可以用同一个键存储多个条目。这是可以作为一个标准的收集,还是我需要滚动我自己的?

    为了澄清这一点,我希望能够做到:

    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
    
    6 回复  |  直到 10 年前
        1
  •  46
  •   Mark Byers    16 年前

    在.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 类是不可变的。如果你想要一个可变的版本,你可以使用 EditableLookup 从 MiscUtil .

        2
  •  11
  •   ChaosPandion    16 年前

    我建议这样做:

    var dict = new Dictionary<int, HashSet<string>>();
    dict.Add(1, new HashSet<string>() { "first", "second" });
    
        3
  •  7
  •   Ondrej Tucny    16 年前

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

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

    作为第二个参数,您应该使用一个集合,该集合提供您正在寻找的质量,即稳定顺序 List<T> 快速访问 HashSet<T> 等。

        4
  •  4
  •   Amit    15 年前

    您一定要使用NameValueCollection:

    使用system.collections.specialic;

    NameValueCollection nvc = new NameValueCollection();
    nvc.Add("pets", "Dog");
    nvc.Add("pets", "Rabbit");
    Console.WriteLine(nvc["pets"]);
    //returns Dog,Rabbit
    
        5
  •  1
  •   Rob    16 年前

    你要找的不是传统意义上的字典(参见 Associative Array )

    据我所知,没有类在框架中提供这种功能( System.Linq.Lookup 不公开构造函数),但可以自己创建一个实现 ILookup<TKey, TElement>

        6
  •  0
  •   supercat    16 年前

    您可以在主键上使用字典,其中每个元素都是您的次键上的列表或其他集合。若要向数据结构中添加项,请查看主键是否存在。如果没有,用您的值创建一个新的单项目列表,并将其存储在字典中。如果主键确实存在,请将值添加到字典中的列表中。