Могу ли я использовать инициализатор коллекции для словарей <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"
   ...

Но какой правильный синтаксис для этого?

Ответ 1

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

Ответ 2

Синтаксис несколько отличается:

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

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

В качестве инициатора sidenote: инициализаторы коллекции содержат аргументы, которые в основном являются аргументами для любой функции 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!" };

Ответ 3

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

Ответ 4

Вопрос отмечен c#-3.0, но для полноты я упомянул новый синтаксис, доступный с С# 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",
};

Ответ 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 бритвы, вам гораздо приятнее смотреть.

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

Ответ 6

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

Ответ 7

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

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

            };