Maneira correta de inicializar um dicionário C # com valores?

513

Estou criando um dicionário em um arquivo C # com o seguinte código:

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

Há uma linha vermelha abaixo newcom o erro:

O recurso 'inicializador de coleções' não pode ser usado porque não faz parte da especificação de idioma ISO-2 C #

Alguém pode explicar o que está acontecendo aqui?

EDIT: ok, então acontece que eu estava usando o .NET versão 2.

azrosen92
fonte
3
Altere a versão da estrutura de destino ou use a maneira "antiga" de inicialização.
Sebastian Ðymel
Em que contexto você coloca esse código? Um .csarquivo que é compilado pelo Visual Studio ou em um arquivo .cshtml? O arquivo dolanguageVersion seu projeto tem um elemento ?
CodeCaster 11/06

Respostas:

826

Não consigo reproduzir esse problema em um aplicativo de console simples do .NET 4.0:

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

        Console.ReadKey();
    }
}

Você pode tentar reproduzi-lo em um aplicativo simples do console e partir daí? Parece provável que você esteja direcionando o .NET 2.0 (que não o suporta) ou a estrutura de perfil do cliente, em vez de uma versão do .NET que suporte a sintaxe de inicialização.

Haney
fonte
11
O problema é a versão do C # que o OP está usando, os inicializadores de objetos / coleções não foram introduzidos até o C # 3.0. Os detalhes de por que não funcionou antes já foram respondidos .
James
@James - Editado para indicar como tal.
Haney
Como verifico qual versão do C # estou usando ou a altero?
azrosen92
3
As propriedades do projeto indicarão a versão de destino da estrutura.
Haney
2
@ James - No entanto, não é confiável, pois essa pessoa pode estar pegando algum trabalho legado em uma solução que estava direcionada para a 2.0 e não está ciente disso, por exemplo.
Haney
198

Com o C # 6.0, você pode criar um dicionário da seguinte maneira:

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

Até funciona com tipos personalizados.

Vikram Kumar
fonte
8
Para as pessoas mais interessadas nesta nova sintaxe aqui é boa postagem no blog: marcin-chwedczuk.github.io/...
csharpfolk
1
Isso é perfeito para declaração em linha.
Tiramonium 19/09/17
1
Bom - não conhecia essa maneira de inicializar. Parece um pouco com Python)) Obrigado!
Mikhail T.
Eu gosto do seu jeito, mas tome nota de que ele usa exatamente o mesmo número de caracteres "padrão" por linha (4) que a resposta aceita com {"key2", "value2"},
Maxter
35

Você pode inicializar um Dictionary(e outras coleções) em linha. Cada membro é contido com chaves:

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

Veja MSDN para detalhes.

Brendan
fonte
21

Suponha que tenhamos um dicionário como este

Dictionary<int,string> dict = new Dictionary<int, string>();
dict.Add(1, "Mohan");
dict.Add(2, "Kishor");
dict.Add(3, "Pankaj");
dict.Add(4, "Jeetu");

Podemos inicializá-lo da seguinte forma.

Dictionary<int, string> dict = new Dictionary<int, string>  
{
    { 1, "Mohan" },
    { 2, "Kishor" },
    { 3, "Pankaj" },
    { 4, "Jeetu" }
};
Debendra Dash
fonte
A resposta do ReSharper.
Antony Booth
10

Os inicializadores de objetos foram introduzidos no C # 3.0, verifique qual versão da estrutura você está direcionando.

Visão geral do C # 3.0

Zbigniew
fonte
0

com c # 6.0

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

        Console.ReadKey();
    }
}
amesh
fonte
3
Isso já foi respondido. Não adicionando nada de novo.
nawfal 6/03