Правильный способ инициализации словаря C # со значениями?

514

Я создаю словарь в файле C # со следующим кодом:

private readonly Dictionary<string, XlFileFormat> FILE_TYPE_DICT
        = new Dictionary<string, XlFileFormat>
        {
            {"csv", XlFileFormat.xlCSV},
            {"html", XlFileFormat.xlHtml}
        };

Есть красная линия newс ошибкой:

Нельзя использовать функцию 'инициализатор коллекции', поскольку она не является частью спецификации языка ISO-2 C #

Кто-нибудь может объяснить, что здесь происходит?

РЕДАКТИРОВАТЬ: хорошо, так получается, что я использовал .NET версии 2.

azrosen92
источник
3
Измените целевую версию фреймворка или используйте «старый» способ инициализации.
Себастьян Рюмель
В каком контексте вы размещаете этот код? .csФайл , который компилируется с помощью Visual Studio, или в .cshtml? Есть ли в вашем файле проекта languageVersionэлемент ?
CodeCaster

Ответы:

827

Я не могу воспроизвести эту проблему в простом консольном приложении .NET 4.0:

static class Program
{
    static void Main(string[] args)
    {
        var myDict = new Dictionary<string, string>
        {
            { "key1", "value1" },
            { "key2", "value2" }
        };

        Console.ReadKey();
    }
}

Можете ли вы попытаться воспроизвести его в простом консольном приложении и перейти оттуда? Вполне вероятно, что вы ориентируетесь на .NET 2.0 (которая не поддерживает его) или на структуру профиля клиента, а не на версию .NET, которая поддерживает синтаксис инициализации.

Хейни
источник
12
Проблема заключается в версии C #, которую использует OP, инициализаторы объекта / коллекции не были представлены до C # 3.0. Подробно о том, почему это не сработало раньше, уже дан ответ .
Джеймс
@James - отредактировано, чтобы указать как таковое.
Хейни
Как проверить, какую версию C # я использую, или изменить ее?
azrosen92
3
В свойствах проекта будет указана целевая версия фреймворка.
Хейни
2
@James - Ненадежно, однако, так как этот человек, возможно, выбирает какую-то устаревшую работу в решении, нацеленном на 2.0, и не знает об этом, например.
Хейни
198

С C # 6.0 вы можете создать словарь следующим образом:

var dict = new Dictionary<string, int>
{
    ["one"] = 1,
    ["two"] = 2,
    ["three"] = 3
};

Это даже работает с пользовательскими типами.

Викрам Кумар
источник
8
Для людей, больше интересующихся этим новым синтаксисом, здесь есть хорошее сообщение в блоге: marcin-chwedczuk.github.io/…
csharpfolk
1
Это идеально подходит для встроенного объявления.
Тирамониум
1
Хорошо - не знал этот способ инициализации. Похоже на Python)) Спасибо!
Михаил Т.
Мне нравится ваш способ лучше, но обратите внимание, что в строке (4) используется точно такое же количество «шаблонных» символов, что и принятого ответа с {«key2», «value2»},
Maxter
35

Вы можете инициализировать Dictionary(и другие коллекции) inline. Каждый член содержит скобки:

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 для деталей.

Brendan
источник
21

Предположим, у нас есть такой словарь

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" }
};
Дебендра Дэш
источник
ReSharper ответ.
Энтони Бут
10

Инициализаторы объектов были введены в C # 3.0, проверьте, на какую версию платформы вы нацеливаетесь.

Обзор C # 3.0

Збигнев
источник
0

с c # 6.0

static class Program
{
    static void Main(string[] args)
    {
        var myDict = new Dictionary<string, string>
        {
           ["Key1"]="Value1",
           ["Key2"]="Value2"
        };

        Console.ReadKey();
    }
}
AMESH
источник
3
На это уже ответили. Не добавляя ничего нового.
Навфал