我可以为Dictionary <tkey,tvalue =“”>条目使用集合初始值设定项吗?</tkey,>

时间:2009-01-30 10:18:00

标签: c# .net generics collections c#-3.0

我想在下一段代码中使用集合初始值设定项:

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"
   ...

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

7 个答案:

答案 0 :(得分:156)

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

答案 1 :(得分:35)

语法略有不同:

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

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

作为旁注:集合初始化器包含的参数基本上是任何 Add()函数的参数,它对于编译时参数类型而言非常方便。也就是说,如果我有一个集合:

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!" };

答案 2 :(得分:11)

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

答案 3 :(得分:10)

问题标记为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",
};

答案 4 :(得分:5)

如果您正在寻找稍微简短的语法,您可以创建Dictionary<string, object>(或任何类型)的子类,如下所示:

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 }
                  });

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

is DebugKeyValueDict代替is IDictionary<string, object>

或在以后更改键或值的类型。 如果你在razor cshtml页面中做这样的事情,那么看起来好多了。

除了不那么冗长之外,您当然可以为此课程添加额外的方法,无论您想要什么。

答案 5 :(得分:1)

在以下代码示例中,使用Dictionary<TKey, TValue>类型的实例初始化StudentName

  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

答案 6 :(得分:-3)

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

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" }  

            };