Могу ли я использовать инициализатор коллекции для записей Dictionary <TKey, TValue>? - PullRequest
94 голосов
/ 30 января 2009

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

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 ]

156 голосов
/ 30 января 2009
var names = new Dictionary<int, string> {
  { 1, "Adam" },
  { 2, "Bart" },
  { 3, "Charlie" }
};
35 голосов
/ 30 января 2009

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

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!" };
11 голосов
/ 30 января 2009
return new Dictionary<int, string>
{ 
   { 1, "Adam" },
   { 2, "Bart" },
   ...
10 голосов
/ 25 сентября 2015

Вопрос помечен 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",
};
5 голосов
/ 22 декабря 2012

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

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

1 голос
/ 15 января 2015

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

0 голосов
/ 16 мая 2017

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

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

            }; 
...