多值字典?

mpe*_*pen 20 c# collections dictionary

谁知道一个好的实现MultiValueDictionary?基本上,我想要一些允许每个键有多个值的东西.我希望能够做类似的事情

dict.Add(key, val);
Run Code Online (Sandbox Code Playgroud)

如果密钥尚不存在,它将添加它,如果它存在,它将只添加该密钥的另一个值.我只是要迭代它,所以我真的不关心其他检索方法.

小智 37

微软刚刚在NuGet上添加了一个官方预发布版本,你正在寻找什么(称为MultiDictionary):https://www.nuget.org/packages/Microsoft.Experimental.Collections/

有关使用情况和更多详细信息,请访问官方MSDN博客文章:http://blogs.msdn.com/b/dotnet/archive/2014/06/20/would-you-like-a-multidictionary.aspx

我是此软件包的开发人员,如果您对性能或任何问题有任何疑问,请在此处或MSDN上告诉我.

希望有所帮助.

  • 嗨@IanHays!多值字典发生了什么?我看到它的代码已存档。它曾经搬到官方住宅吗? (4认同)
  • 这个答案需要站起来。 (2认同)
  • 它已重命名为“MultiValueDictionary”。 (2认同)

Guf*_*ffa 21

您可以从列表字典轻松制作一个:

public class MultiValueDictionary<Key, Value> : Dictionary<Key, List<Value>> {

  public void Add(Key key, Value value) {
    List<Value> values;
    if (!this.TryGetValue(key, out values)) {
      values = new List<Value>();
      this.Add(key, values);
    }
    values.Add(value);
  }

}
Run Code Online (Sandbox Code Playgroud)


Hen*_*man 11

它不存在,但您可以从Dictionary和List中快速构建一个:

class MultiDict<TKey, TValue>  // no (collection) base class
{
   private Dictionary<TKey, List<TValue>> _data =  new Dictionary<TKey,List<TValue>>();

   public void Add(TKey k, TValue v)
   {
      // can be a optimized a little with TryGetValue, this is for clarity
      if (_data.ContainsKey(k))
         _data[k].Add(v)
      else
        _data.Add(k, new List<TValue>() { v}) ;
   }

   // more members
}
Run Code Online (Sandbox Code Playgroud)

  • @Mark:`List <T> .Add`具有[摊销](http://en.wikipedia.org/wiki/Amortized)O(1)性能,并且通常比`LinkedList <T>快**.AddLast `因为它需要更少的操作.`LinkedList <T> .AddLast`可能有意义,如果你想*永远不会发生O(n)调整大小(即使它很少发生在你只是添加的`List <T>`). (4认同)
  • @Mark:是的.当你永远不会从中间插入/删除时,我很少看到在`List <T>`上选择`LinkedList <T>`是有意义的情况(那就是`LinkedList <T>`真的很棒) .当你刚刚添加到*end*时,`LinkedList <T>`只会让你花费更多(例如,创建`LinkedListNode <T>`objects =>更多字段来初始化=>消除数组的性能由于极其优化的内存访问的优势而获得的好处很少:蓝色月亮中的一个`LinkedList <T> .AddLast`将胜过单个`List <T> .Add`.其余的将是相反的. (4认同)
  • 与链接列表相比,列表还对缓存更友好 (2认同)