如何在c#中向Dictionary中添加多个值

本文关键字:添加 Dictionary 中向 | 更新日期: 2023-09-27 18:02:38

如果我不想调用".Add()";很多次了。

Edit:我想在初始化后填充它!字典里已经有一些值了!

所以不用

    myDictionary.Add("a", "b");
    myDictionary.Add("f", "v");
    myDictionary.Add("s", "d");
    myDictionary.Add("r", "m");
    ...

我想做这样的事情

 myDictionary.Add(["a","b"], ["f","v"],["s","d"]);

有办法吗?

如何在c#中向Dictionary中添加多个值

可以使用花括号,不过这只适用于初始化:

var myDictionary = new Dictionary<string, string>
{
    {"a", "b"},
    {"f", "v"},
    {"s", "d"},
    {"r", "m"}
};

这被称为"集合初始化",适用于任何ICollection<T>(参见字典的链接或任何其他集合类型的链接)。事实上,它适用于任何实现IEnumerable并包含Add方法的对象类型:

class Foo : IEnumerable
{
    public void Add<T1, T2, T3>(T1 t1, T2 t2, T3 t3) { }
    // ...
}
Foo foo = new Foo
{
    {1, 2, 3},
    {2, 3, 4}
};

基本上这只是重复调用Add -方法的语法糖。在初始化之后,有几种方法可以做到这一点,其中一种是手动调用Add -方法:

var myDictionary = new Dictionary<string, string>
    {
        {"a", "b"},
        {"f", "v"}
    };
var anotherDictionary = new Dictionary<string, string>
    {
        {"s", "d"},
        {"r", "m"}
    };
// Merge anotherDictionary into myDictionary, which may throw
// (as usually) on duplicate keys
foreach (var keyValuePair in anotherDictionary)
{
    myDictionary.Add(keyValuePair.Key, keyValuePair.Value);
}

或扩展方法:

static class DictionaryExtensions
{
    public static void Add<TKey, TValue>(this IDictionary<TKey, TValue> target, IDictionary<TKey, TValue> source)
    {
        if (source == null) throw new ArgumentNullException("source");
        if (target == null) throw new ArgumentNullException("target");
        foreach (var keyValuePair in source)
        {
            target.Add(keyValuePair.Key, keyValuePair.Value);
        }
    }
}
var myDictionary = new Dictionary<string, string>
    {
        {"a", "b"},
        {"f", "v"}
    };
myDictionary.Add(new Dictionary<string, string>
    {
        {"s", "d"},
        {"r", "m"}
    });

这不是一个完全重复的问题,但您可能想要的是有一个Dictionary.AddRange()方法。这就是为什么它不存在的原因:

为什么字典没有't AddRange?

"Range对于关联容器来说没有任何意义。"

但是为Dictionary类编写自己的.AddRange()方法可能是个好主意。它本质上是一个循环的.Add()调用。

虽然这个问题已经得到了回答,但我很好奇是否有可能将类似集合初始化器的语法应用于已经初始化的字典,而不需要创建第二个字典来合并和丢弃。

你可以使用(abuse?)集合初始化器用于在创建后向现有字典添加一系列值。如何?通过创建一个帮助类来完成:

public class AddRangeTo<TKey, TValue> : IEnumerable
{
    private readonly IDictionary<TKey, TValue> WrappedDictionary;
    public AddRangeTo(IDictionary<TKey, TValue> wrappedDictionary)
    {
        this.WrappedDictionary = wrappedDictionary;
    }
    public void Add(TKey key, TValue value)
    {
        this.WrappedDictionary.Add(key, value);
    }
    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        throw new NotSupportedException();
    }
}
与用法:

var myDictionary = new Dictionary<string, string>();
new AddRangeTo<string, string>(myDictionary)
{
    {"a", "b"},
    {"f", "v"},
    {"s", "d"},
    {"r", "m"}
};

注意,这允许您使用类似的语法向字典中添加条目,但是要添加到已经初始化的字典中。有点糟糕的部分是<string, string>泛型的重复,但这在c# 6.0中是不必要的。(编辑:也就是说,在c# 6中,它看起来像new AddRangeTo(myDictionary))(编辑:该功能从c# 6中取消)

话虽如此,我并不建议一定要这么做。这是奇怪的语法/用法,具有意想不到的副作用,我认为当其他人遇到它时可能会感到困惑。但是,如果您发现您实际上会经常使用它,并使您的内部代码更易于使用和维护,那么就有好处了!

您可以在初始化时执行,就像所有其他答案显示一样,或者您可以将其与以下技巧结合使用:

Dictionary<string, string> myDictionary = new Dictionary<string, string>();
Dictionary<string, string> secondDictionary = new Dictionary<string, string>()
{ 
    {"1", "a"}, 
    {"2", "b"} 
};
myDictionary = myDictionary.Union(secondDictionary)
                           .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);

你必须确保没有重复的键,否则你会得到一个异常(但这与Add方法是一样的)。

你可以这样做:

var myDict = new Dictionary<string, string>() 
{
    {"a", "aa"},
    {"b", "bb"},
    {"c", "cc"},
    {"d", "dd"}
};

这可以在主代码路径之外完成,这样可以减少使用扩展方法时发生的混乱。

public static class DictionaryExtensions
{
  public static IDictionary<TKey,TValue> AddRange<TKey,TValue>(
               this IDictionary<TKey,TValue> source,
               params  KeyValuePair<TKey,TValue>[] items)
  {
    foreach (var keyValuePair in items)
    {
      source.Add(keyValuePair.Key, keyValuePair.Value);
    }
    return source;
  }
}

这将是一个简单的谷歌搜索:http://msdn.microsoft.com/en-us/library/bb531208.aspx。不管怎样…下面是代码:

Dictionary<string, string> myDictionary = new Dictionary<string, string>()
{
    { 'a', 'b' },
    { 'c', 'd' },
    { 'e', 'f' }
};

当然,您也可以编写一个循环或其他东西来迭代您的值,并每次调用.add()方法。

你可以在初始化时:

new Dictionary<string, string> { {"a","b"}, {"f","v"},{"s","d"} }

这称为集合初始化式。当您想要向已经存在的字典中添加多个条目时,您可以编写一个方法

我有一个完美的初始化示例。假设你想把罗马转换成整数。您收到一个带有罗马数字的字符串,您需要一种方法来映射每个字符的含义。在c#中,您将使用包含字符及其等效整数

的字典。
var map = new Dictionary<char, int>{
        {'M',1000},
        {'D',500},
        {'C',100},
        {'L',50},
        {'X',10},
        {'V',5},
        {'I',1}
    };

myDictionary =新词典(){{"a",2)},{"b",3}};