Можно ли использовать инициализатор коллекции для словарных статей?


Я хочу использовать инициализатор коллекции для следующего бита кода:

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 94

7 ответов:

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

синтаксис немного отличается:

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

обратите внимание, что вы эффективно добавление кортежей значений.

в качестве побочного Примечания: инициализаторы коллекции содержат аргументы, которые в основном являются аргументами для любого добавить() функция, которая пригодится в отношении типа аргумента времени компиляции. То есть, если у меня есть коллекция:

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

если вы ищете немного менее многословный синтаксис, вы можете создать подкласс 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, на которую намного приятнее смотреть.

а также будучи менее подробным вы можете, конечно, добавить дополнительные методы к этому классу для того, что вы можете захотеть.

В следующем примере кода 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

Да, мы можем использовать инициализатор коллекции в словарь.Если у нас есть такой-

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

            };