我可以使用Dictionary <TKey,TValue>条目的集合初始值设定项吗?

我想为下一个代码使用一个集合初始值设定项:

public Dictionary<int, string> GetNames() { Dictionary<int, string> names = new Dictionary<int, string>(); names.Add(1, "Adam"); names.Add(2, "Bart"); names.Add(3, "Charlie"); return names; } 

所以通常应该是这样的:

 return new Dictionary<int, string> { 1, "Adam", 2, "Bart" ... 

但是,这是什么正确的语法?

 var names = new Dictionary<int, string> { { 1, "Adam" }, { 2, "Bart" }, { 3, "Charlie" } }; 

语法稍有不同:

 Dictionary<int, string> names = new Dictionary<int, string>() { { 1, "Adam" }, { 2, "Bart" } } 

请注意,您正在有效地添加值的元组。

作为一个旁注:集合初始化包含参数,这些参数基本上是任何Add()函数的参数,这些参数与编译时types的参数相关。 也就是说,如果我有一个集合:

 class FooCollection : IEnumerable { public void Add(int i) ... public void Add(string s) ... public void Add(double d) ... } 

以下代码是完全合法的:

 var foos = new FooCollection() { 1, 2, 3.14, "Hello, world!" }; 
 return new Dictionary<int, string> { { 1, "Adam" }, { 2, "Bart" }, ... 

这个问题被标记为c#-3.0 ,但为了完整c#-3.0 ,我将提到C#6中可用的新语法,以防使用Visual Studio 2015(或Mono 4.0):

 var dictionary = new Dictionary<int, string> { [1] = "Adam", [2] = "Bart", [3] = "Charlie" }; 

注意:其他答案中提到的旧语法仍然有效,如果你更喜欢这个。 再次,为了完整性,这里是旧的语法:

 var dictionary = new Dictionary<int, string> { { 1, "Adam" }, { 2, "Bart" }, { 3, "Charlie" } }; 

另一种很酷的事情要注意的是,无论使用哪种语法,如果你喜欢,可以留下最后一个逗号,这样可以更容易复制/粘贴更多行。 例如,以下编译就好了:

 var dictionary = new Dictionary<int, string> { [1] = "Adam", [2] = "Bart", [3] = "Charlie", }; 

如果你正在寻找稍微冗长的语法,你可以创build一个Dictionary<string, object> (或者你的types)的子类,如下所示:

 public class DebugKeyValueDict : Dictionary<string, object> { } 

然后像这样初始化

 var debugValues = new DebugKeyValueDict { { "Billing Address", billingAddress }, { "CC Last 4", card.GetLast4Digits() }, { "Response.Success", updateResponse.Success } }); 

这相当于

 var debugValues = new Dictionary<string, object> { { "Billing Address", billingAddress }, { "CC Last 4", card.GetLast4Digits() }, { "Response.Success", updateResponse.Success } }); 

好处是你得到所有的编译types的东西,你可能想要的,如能够说

is DebugKeyValueDict而不是is IDictionary<string, object>

或在以后更改密钥或值的types。 如果你在一个剃刀的cshtml页面中做这样的事情,看起来好多了。

除了不那么详细,你可以为这个类添加额外的方法,无论你想要什么。

在下面的代码示例中,使用StudentNametypes的实例初始化Dictionary<TKey, TValue>

  Dictionary<int, StudentName> students = new Dictionary<int, StudentName>() { { 111, new StudentName {FirstName="Sachin", LastName="Karnik", ID=211}}, { 112, new StudentName {FirstName="Dina", LastName="Salimzianova", ID=317}}, { 113, new StudentName {FirstName="Andy", LastName="Ruth", ID=198}} }; 

从msdn

是的,我们可以在字典中使用集合初始化器。如果我们有这样的字典 –

 Dictionary<int,string> dict = new Dictionary<int,string>(); dict.Add(1,"Mohan"); dict.Add(2, "Kishor"); dict.Add(3, "Pankaj"); dict.Add(4, "Jeetu"); 

我们可以将其初始化如下。

 Dictionary<int,string> dict = new Dictionary<int,string> { {1,"Mohan" }, {2,"Kishor" }, {3,"Pankaj" }, {4,"Jeetu" } };