¿Forma correcta de inicializar un diccionario C # con valores?

514

Estoy creando un diccionario en un archivo C # con el siguiente código:

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

Hay una línea roja debajo newcon el error:

La función 'initilializer de colección' no se puede usar porque no forma parte de la especificación del lenguaje ISO-2 C #

¿Alguien puede explicar lo que está pasando aquí?

EDITAR: está bien, así que resultó que estaba usando .NET versión 2.

azrosen92
fuente
3
Cambie la versión de marco específica o use la forma "antigua" de inicialización.
Sebastian Ðymel
¿En qué contexto coloca este código? ¿Un .csarchivo compilado por Visual Studio o en un .cshtml? ¿Su archivo de proyecto tiene un languageVersionelemento ?
CodeCaster

Respuestas:

827

No puedo reproducir este problema en una simple aplicación de consola .NET 4.0:

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

        Console.ReadKey();
    }
}

¿Puedes intentar reproducirlo en una aplicación de consola simple y seguir desde allí? Parece probable que esté apuntando a .NET 2.0 (que no lo admite) o al marco del perfil del cliente, en lugar de una versión de .NET que admita la sintaxis de inicialización.

Haney
fuente
12
El problema es la versión de C # que está utilizando el OP, los inicializadores de objeto / colección no se introdujeron hasta C # 3.0. El detalle de por qué no funcionó antes ya ha sido respondido .
James
@James: editado para indicar como tal.
Haney
¿Cómo verifico qué versión de C # estoy usando o la cambio?
azrosen92
3
Las propiedades del proyecto indicarán la versión de destino del marco.
Haney
2
@James: sin embargo, no es confiable, ya que esta persona puede estar recogiendo algo de trabajo heredado en una solución que estaba dirigida a 2.0 y no lo sabe, por ejemplo.
Haney
198

Con C # 6.0, puede crear un diccionario de la siguiente manera:

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

Incluso funciona con tipos personalizados.

Vikram Kumar
fuente
8
Para las personas más interesadas en esta nueva sintaxis, aquí hay una buena publicación de blog: marcin-chwedczuk.github.io/…
csharpfolk
1
Esto es perfecto para la declaración en línea.
Tiramonium
1
Agradable, no conocía esta forma de inicializar. Se parece un poco a Python)) ¡Gracias!
Mikhail T.
Me gusta más tu camino, pero toma nota de que usa exactamente el mismo número de caracteres "repetitivos" por línea (4) que la respuesta aceptada con {"clave2", "valor2"},
Maxter
35

Puede inicializar una Dictionary(y otras colecciones) en línea. Cada miembro está contenido con llaves:

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

Ver MSDN para más detalles.

Brendan
fuente
21

Supongamos que tenemos un diccionario 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 inicializarlo de la siguiente manera.

Dictionary<int, string> dict = new Dictionary<int, string>  
{
    { 1, "Mohan" },
    { 2, "Kishor" },
    { 3, "Pankaj" },
    { 4, "Jeetu" }
};
Debendra Dash
fuente
La respuesta de ReSharper.
Antony Booth
0

con c # 6.0

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

        Console.ReadKey();
    }
}
una malla
fuente
3
Esto ya está respondido. No agrego nada nuevo.
nawfal