我可以对Dictionary <TKey,TValue>条目使用集合初始化程序吗?


94

我想在下一段代码中使用集合初始化程序:

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

但是正确的语法是什么?




不要以为这是骗子,因为他们不是在问速记字典声明语法,而是问为什么速记在他们的(古老的)设置中不起作用。
NH。

Answers:


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

1
初始化器什么时候起作用?它仅适用于Dictionary<TKey, TValue>子类还是可以使用ICollection<KeyValuePair<TKey, TValue>>
Shimmy Weitzhandler

C#3.0后,您可以使用var声明类型来代替,或者如果留下声明类型可以省略new Dictio...- stackoverflow.com/questions/5678216/...
drzaus

1
@drzaus:使用var是一个丑陋的做法;C#是一种强类型语言。
Nyerguds 2014年

1
@Nyerguds:什么? var字面意义上只是为您节省了击键,它是隐式强类型的
drzaus

4
@Nyerguds-我想您有权发表自己的意见,但是,如果您立即初始化变量,那么使用var和重复使用之间实际上没有区别SomeType obj = new SomeType...。而且由于您无法var obj;立即初始化就无法声明,所以我看不到问题所在。确实,我正在尝试学习,但是我无法掌握你的位置。
drzaus 2014年

36

语法略有不同:

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

好答案,我不知道!无论如何,字典初始化程序什么时候起作用?它仅适用于Dictionary <TKey,TValue>子类,还是可以用于ICollection <KeyValuePair <TKey,TValue >>?
Shimmy Weitzhandler

@Shimmy Collection初始化程序可用于实现IEnumerable 具有Add()方法的任何对象。
Anton Gogolev

@Shimmy:字典就是收藏集
John Saunders

@JohnSaunders但是字典初始化程序接受的两个参数Add
Shimmy Weitzhandler,2012年

2
@Shimmy:为什么这么重要?关键是它将与任何实现IEnumerable<T>且具有Add方法的类一起使用。如果该Add方法采用3个参数,则括号中将需要3个对象。
约翰·桑德斯

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

10

这个问题被标记了c#-3.0,但是为了完整起见,如果您使用的是Visual Studio 2015(或Mono 4.0),我将提及C#6提供的新语法:

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

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>

或稍后更改键或值的类型。如果您在剃须刀cshtml页面中正在执行类似的操作,那么看起来会更好。

除了不那么冗长之外,您当然可以为您想要的任何类添加额外的方法。


这基本上是一个的ViewDataDictionary如何在MVC - stackoverflow.com/questions/607985/...
Simon_Weaver

我尝试将类型用作“字典”和“类型化数组”的“别名”,并假设在类型化世界中使用预定义类型会更安全。
帕特里克(Patrick)

1

在以下代码示例中,使用Dictionary<TKey, TValue>type的实例初始化a 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


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

            }; 

4
已经有6个其他答案显示了如何执行此操作。我们不需要显示相同内容的第七个答案。
Servy '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.