Инициализаторы коллекций в языке C#


В Java я могу создать список и сразу же заполнить его с помощью статического инициализатора. Что-то вроде этого:


List &ltString&gt list = new ArrayList&ltString&gt()
{{
    Add("a");
    Add("b");
    Add("c");
}}

Что удобно, потому что я могу создать список на лету и передать его в качестве аргумента в функцию. Что-то вроде этого:


printList(new ArrayList&ltString&gt()
{{
    Add("a");
    Add("b");
    Add("c");
}});

Я новичок в C# и пытаюсь понять, как это сделать, но ничего не получается. Возможно ли это в C#? И если да, то как это сделать?

3 3

3 ответа:

Можно использовать инициализатор коллекции:

new List<string> { "a", "b", "c" }

Это компилируется в последовательность вызовов метода Add.
Если метод Add принимает несколько аргументов (например, словарь), вам нужно будет обернуть каждый вызов в отдельную пару фигурных скобок:

new Dictionary<string, Exception> {
    { "a", new InvalidProgramException() },
    { "b", null },
    { "c", new BadImageFormatException() }
}

Так как C# 3.0 Вы можете сделать это также:

List <String> list = new List<String>
                     {
                             "a", "b", "c"
                     };

MSDN, инициализаторы коллекций

Инициализаторы коллекции позволяют указать один или несколько элементов intializers при инициализации класса коллекции, реализующего интерфейс IEnumerable. Инициализаторы элементов могут быть простыми значениями, например: выражение или инициализатор объекта. С помощью инициализатора коллекции вам не нужно указывать несколько вызовов метода Add объекта класс В исходном коде; компилятор добавляет вызовы.

EDIT: ответ на комментарий относительно словаря

IDictionary<string, string> map = new Dictionary<string, string>
{
   { "Key0", "Value0" },
   { "Key1", "Value1" }
};

Да, это описано на MSDN здесь