一次向C#字典添加许多行

时间:2017-06-21 18:52:33

标签: c# dictionary

如果我实例化一个新的Dictionary,我可以传递许多值:

Dictionary<string, string> data = new Dictionary<string, string>(){
    { "Key1", "Value1" },
    { "Key2", "Value2" },
    { "Key3", "Value3" },
    { "Key4", "Value4" },
    { "Key5", "Value5" },
}

但是,如果我已经有Dictionary,例如在参数中传递时,我需要为每个键值对调用Add

data.Add("Key1", "Value1");
data.Add("Key2", "Value2");
data.Add("Key3", "Value3");
data.Add("Key4", "Value4");
data.Add("Key5", "Value5");

我想知道是否有一种“速记”方法可以同时向现有词典中添加大量值 - 最好是原生的?如果是这种情况,欢迎权威的“不”。

不像我想要的那么干净,但这些是我所知道的两种选择。

这个允许一次传递多个值,但需要创建一个新的Dictionary而不是更新现有的值:

Dictionary<string, string> newData = new Dictionary<string, string>(data)
{
    { "Key6", "Value6"},
    { "Key7", "Value7"},
    { "Key8", "Value8"},
};

也可以创建一个扩展方法,但这仍然会为每一行调用Add

public static void AddMany<Tkey, TValue>(this Dictionary<Tkey, TValue> dict, Dictionary<Tkey, TValue> toAdd)
{
    foreach(KeyValuePair<Tkey, TValue> row in toAdd)
    {
        dict.Add(row.Key, row.Value);
    }
}

2 个答案:

答案 0 :(得分:5)

  

如果是这样的话,欢迎权威的“不”。

情况就是这样。

不,没有AddRange或等价物,因为没有实际的方法可以一次向词典中添加多个项目。 List一次添加多个项是有意义的,因为它们可以在一个命令中复制到内部数组中。

对于Dictionary,必须计算每个项目的哈希码以确定该值将存储在哪个“桶”中,因此必须迭代每个项目。因此,AddRange方法或其等价物最多只能是语法糖。在最坏的情况下,如果列表中的任何项已经存在,则需要定义会发生什么。会抛出异常吗?如果是这样,重复之前添加的项目是否会留在字典中?如果没有,它会无声地跳过该项目或替换副本吗?

这些问题没有直观正确的答案,因此尚未预先确定。

答案 1 :(得分:0)

如果您经常需要在字典中添加多个项目,则可以制作扩展方法

public static class DictionaryExtensions
{
  public static void AddRange<TKey, TValue>(this Dictionary<TKey, TValue> dic, List<KeyValuePair<TKey, TValue>> itemsToAdd)
  {
    itemsToAdd.ForEach(x => dic.Add(x.Key, x.Value));
  }
}

以上内容适用于批量添加已知的唯一商品。如果您需要关注欺骗,那么您需要添加健全性检查,并可能返回一个bool列表,让您知道哪个成功..但此时您可能放弃扩展方法,因为大部分便利会迷路了。