C# 我可以为字典使用集合初始值设定项吗<;TKey,TValue>;条目?

C# 我可以为字典使用集合初始值设定项吗<;TKey,TValue>;条目?,c#,.net,generics,collections,c#-3.0,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; }

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

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;
}
公共字典GetNames()
{
字典名称=新字典();
名称。添加(1,“亚当”);
名称。添加(2,“Bart”);
名称。添加(3,“查理”);
返回姓名;
}
因此,通常应该是这样的:

return new Dictionary<int, string>
{ 
   1, "Adam",
   2, "Bart"
   ...
返回新字典
{ 
1,“亚当”,
2,“巴特”
...
但是正确的语法是什么呢?

返回新字典
return new Dictionary<int, string>
{ 
   { 1, "Adam" },
   { 2, "Bart" },
   ...
{ {1,“亚当”}, {2,“巴特”}, ...
语法略有不同:

Dictionary<int, string> names = new Dictionary<int, string>()
{
    { 1, "Adam" },
    { 2, "Bart" }
}
以下代码完全合法:

var foos = new FooCollection() { 1, 2, 3.14, "Hello, world!" };
var name=新字典{
{1,“亚当”},
{2,“巴特”},
{3,“查理”}
};

如果您要查找稍微不太详细的语法,可以创建
字典
(或任何类型)的子类,如下所示:

public class DebugKeyValueDict : Dictionary<string, object>
{

}
这相当于

var debugValues = new Dictionary<string, object>
                  {
                       { "Billing Address", billingAddress }, 
                       { "CC Last 4", card.GetLast4Digits() },
                       { "Response.Success", updateResponse.Success }
                  });
var debugValues=新字典
{
{“账单地址”,账单地址},
{“CC Last 4”,card.GetLast4Digits()},
{“Response.Success”,updateResponse.Success}
});
这样做的好处是,您可以获得您可能需要的所有编译类型的内容,例如

是DebugKeyValueDict
而不是
是IDictionary

或者在以后更改键或值的类型。 如果您在一个razor cshtml页面中执行类似的操作,那么查看它会更好


除了不太冗长之外,您当然可以为这个类添加额外的方法,以满足您的任何需要。

在下面的代码示例中,使用类型为
StudentName
的实例初始化
Dictionary

  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}}
  };
Dictionary学生=新字典()
{
{111,新学生名{FirstName=“Sachin”,LastName=“Karnik”,ID=211},
{112,新学生名{FirstName=“Dina”,LastName=“Salimzianova”,ID=317},
{113,新学生名{FirstName=“Andy”,LastName=“Ruth”,ID=198}
};

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

var字典=新字典
{
[1] =“亚当”,
[2] =“巴特”,
[3] =“查理”
};
注意:如果您更喜欢的话,其他答案中提到的旧语法仍然有效。同样,为了完整性,这里是旧语法:

var dictionary = new Dictionary<int, string>
{
   { 1, "Adam" },
   { 2, "Bart" },
   { 3, "Charlie" }
};
var字典=新字典
{
{1,“亚当”},
{2,“巴特”},
{3,“查理”}
};
另一种需要注意的很酷的事情是,如果您愿意,使用这两种语法都可以保留最后一个逗号,这样可以更容易地复制/粘贴其他行。例如,下面的编译很好:

var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie",
};
var字典=新字典
{
[1] =“亚当”,
[2] =“巴特”,
[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 dict=new Dictionary();
添加第(1)条,“默翰”);
添加(2,“基索”);
添加第(3)款,“Pankaj”);
添加(4,“Jeetu”);
我们可以如下初始化它

Dictionary<int,string> dict = new Dictionary<int,string>  
            {  

                {1,"Mohan" },  
                {2,"Kishor" },  
                {3,"Pankaj" },  
                {4,"Jeetu" }  

            }; 
Dictionary dict=新字典
{  
{1,“默翰”},
{2,“基索”},
{3,“Pankaj”},
{4,“Jeetu”}
}; 

初始值设定项什么时候起作用?它只适用于
字典
子类还是也适用于
ICollection
?在C#3.0之后,你可以使用
var
代替声明类型,或者如果离开声明类型可以省略
新词…
。@drzaus:使用var是一个丑陋的、丑陋的做法;C#是一个stroNyerguds:什么?
var
实际上只是帮你省去了击键,是的。@Nyerguds——我想你有权发表你的意见,但如果你立即初始化变量,那么使用
var
和使用
SomeType obj=new SomeType…
重复你自己的操作就没有什么区别了既然你不能在不立即初始化的情况下声明
var obj;
,我就看不出问题所在。真的,我正在努力学习,但我无法确定你的立场。答案很好,我不知道这一点!不管怎样,字典初始值设定项什么时候起作用?它只适用于字典子类还是也适用于ICollection?@Shimmy Collection初始值设定项处理任何实现
IEnumerable
且具有
Add()
方法。@Shimmy:字典是collections@JohnSaunders但是字典初始值设定项接受
Add
@Shimmy的两个参数:这有什么关系?关键是它将与任何实现
IEnumerable
且具有
Add
方法的类一起工作。如果
Add
方法接受3个参数,那么括号中需要3个对象。这就是ViewDataDictionary在MVC中的基本工作原理-我尝试将类型作为字典和类型化数组的“别名”,假设在类型化的世界中使用预定义类型会更安全。结果证明,在泛型和linq方面没有那么大的用处。检查这篇文章:可能重复当然,不要认为这是一个骗局,因为他们不是在问速记字典声明语法,而是在问为什么速记在他们(古代)的设置中不起作用。已经有6个其他答案说明了如何做到这一点。我们不需要第7个答案说明同样的事情。
var dictionary = new Dictionary<int, string>
{
   { 1, "Adam" },
   { 2, "Bart" },
   { 3, "Charlie" }
};
var dictionary = new Dictionary<int, string>
{
   [1] = "Adam",
   [2] = "Bart",
   [3] = "Charlie",
};
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" }  

            };