我可以使用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页面中做这样的事情,看起来好多了。
除了不那么详细,你可以为这个类添加额外的方法,无论你想要什么。
在下面的代码示例中,使用StudentName
types的实例初始化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" } };