Коллекция инициализаторов в C # - PullRequest
3 голосов
/ 25 октября 2011

В 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 ]

8 голосов
/ 25 октября 2011

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

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

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

new Dictionary<string, Exception> {
    { "a", new InvalidProgramException() },
    { "b", null },
    { "c", new BadImageFormatException() }
}
2 голосов
/ 25 октября 2011

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

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

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

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

РЕДАКТИРОВАТЬ: Ответ на комментарий относительно словаря

IDictionary<string, string> map = new Dictionary<string, string>
{
   { "Key0", "Value0" },
   { "Key1", "Value1" }
};
1 голос
/ 25 октября 2011

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

...