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


513

Я створюю словник у файлі C # із таким кодом:

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

Під червоною лінією new є помилка:

Функцію "ініціалізатор колекції" не можна використовувати, оскільки вона не є частиною специфікації мови ISO-2 C #

Хтось може пояснити, що тут відбувається?

EDIT: добре, тож виявляється, я використовував .NET версію 2.


3
Змініть цільову версію фреймворку або використовуйте "старий" спосіб ініціалізації.
Себастьян Римель

У якому контексті ви розміщуєте цей код? .csФайл , який компілюється з допомогою Visual Studio, або в .cshtml? Чи є у вашому файлі проекту languageVersionелемент ?
CodeCaster

Відповіді:


826

Я не можу відтворити цю проблему в простому додатку консолі .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, яка підтримує синтаксис ініціалізації.


11
Проблема полягає у використанні версії C #, яку використовує ОП, ініціалізатори об'єктів / колекції не були введені до C # 3.0. Деталі, чому це не працювало раніше, вже отримали відповіді .
Джеймс

@James - Відредаговано для позначення як такого.
Хені

Як перевірити, яку версію C # я використовую чи змінити?
azrosen92

3
Властивості проекту вказуватимуть цільову версію рамки.
Хені

2
@James - Однак не надійно, оскільки ця людина, можливо, збирає деякі застарілі роботи в рішенні, націленому на 2.0 і не знаючи про це, наприклад.
Хені

197

За допомогою 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(та інші колекції). Кожен член містить дужки:

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 .


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.
Ентоні Бут


0

з c # 6.0

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

        Console.ReadKey();
    }
}

2
На це вже відповіли. Не додаючи нічого нового.
nawfal
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.