如果我不想调用" .Add()"将多个值添加到词典中的最佳方法是什么?多次。 修改:我想在启动后填写它!字典中已有一些值!
所以而不是
myDictionary.Add("a", "b");
myDictionary.Add("f", "v");
myDictionary.Add("s", "d");
myDictionary.Add("r", "m");
...
我想做像这样的事情
myDictionary.Add(["a","b"], ["f","v"],["s","d"]);
有没有办法这样做?
答案 0 :(得分:16)
你可以使用大括号,虽然这只适用于初始化:
var myDictionary = new Dictionary<string, string>
{
{"a", "b"},
{"f", "v"},
{"s", "d"},
{"r", "m"}
};
这称为&#34;集合初始化&#34;并适用于任何ICollection<T>
(对于字典,请参阅link,对于任何其他集合类型,请参阅此link)。实际上,它适用于实现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"}
});
答案 1 :(得分:5)
这不是一个完全重复的问题,但您可能想要的是Dictionary.AddRange()
方法。这就是为什么不存在的原因:
Why doesn't Dictionary have AddRange?
&#34;范围对于关联容器没有任何意义。&#34;
但是将自己的.AddRange()
方法编写到Dictionary类可能是个好主意。它本质上是.Add()
调用的循环。
答案 2 :(得分:4)
虽然问题已经得到解答,但我很好奇是否可以将类似集合初始化器的语法应用于已经初始化的字典没有创建第二个字典的创建/开销合并并扔掉。
您可以使用(滥用?)Collection Initializers在创建之后为现有词典添加一系列值。怎么样?通过创建一个辅助类来完成它:
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中,它看起来像(编辑:此功能已从C#6中删除)new AddRangeTo(myDictionary)
)
所有人都说,我不建议这样做。这是奇数语法/用法,带有意想不到的副作用,我认为当遇到它时可能会让其他人感到困惑。但是如果你发现你实际上会使用它并使你的内部代码更容易使用和维护,那么奖金!
答案 3 :(得分:3)
你可以这样做:
var myDict = new Dictionary<string, string>()
{
{"a", "aa"},
{"b", "bb"},
{"c", "cc"},
{"d", "dd"}
};
答案 4 :(得分:3)
你可以像所有其他答案节目一样在初始化时进行,或者你可以将它与这个技巧结合起来:
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
方法相同)。
答案 5 :(得分:0)
这将是一个简单的谷歌搜索:http://msdn.microsoft.com/en-us/library/bb531208.aspx。 无论如何......这是代码:
Dictionary<string, string> myDictionary = new Dictionary<string, string>()
{
{ 'a', 'b' },
{ 'c', 'd' },
{ 'e', 'f' }
};
当然,您也可以编写一个循环或其他内容来迭代您的值并每次调用.add()方法。
答案 6 :(得分:0)
好吧,你可以进行初始化:
new Dictionary<string, string> { {"a","b"}, {"f","v"},{"s","d"} }
这称为集合初始值设定项。 如果要将多个项目添加到现有字典中,可以编写方法。
答案 7 :(得分:-1)
这可以通过主代码路径完成,允许您使用扩展方法减少混乱。
public static class DictionaryExtensions{
public static Dictionary<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;
}
}
答案 8 :(得分:-1)
myDictionary = new Dictionary(){{&#34; a&#34;,2)},{&#34; b&#34;,3},};