Procedimientos: inicialización de un diccionario con un inicializador de colección (guía de programación de C#)

Una clase Dictionary<TKey,TValue> contiene una colección de pares clave-valor. Su método Add toma dos parámetros: uno para la clave y otro para el valor. Una manera de inicializar Dictionary<TKey,TValue>, o cualquier colección cuyo método Add tome varios parámetros, es incluir entre llaves cada conjunto de parámetros, como se muestra en el ejemplo siguiente. Otra opción es usar un inicializador de índice, lo que también se muestra en el ejemplo siguiente.

Nota

La diferencia principal entre estas dos formas de inicializar la colección es que, en el caso de tener claves duplicadas, por ejemplo:

{ 111, new StudentName { FirstName="Sachin", LastName="Karnik", ID=211 } },
{ 111, new StudentName { FirstName="Dina", LastName="Salimzianova", ID=317 } }, 

el método Add iniciará ArgumentException: 'An item with the same key has already been added. Key: 111', mientras que la segunda parte del ejemplo, el método de indexador de lectura y escritura público, sobrescribirá silenciosamente la entrada ya existente con la misma clave.

Ejemplo

En el ejemplo de código siguiente, Dictionary<TKey,TValue> se inicializa con instancias de tipo StudentName. La primera inicialización usa el método Add con dos argumentos. El compilador genera una llamada a Add por cada uno de los pares de claves int y valores StudentName. La segunda usa un método de indizador de lectura y escritura público de la clase Dictionary:

public class HowToDictionaryInitializer
{
    class StudentName
    {
        public string? FirstName { get; set; }
        public string? LastName { get; set; }
        public int ID { get; set; }
    }

    public static void Main()
    {
        var 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 } }
        };

        foreach(var index in Enumerable.Range(111, 3))
        {
            Console.WriteLine($"Student {index} is {students[index].FirstName} {students[index].LastName}");
        }
        Console.WriteLine();		

        var students2 = 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 }
        };

        foreach (var index in Enumerable.Range(111, 3))
        {
            Console.WriteLine($"Student {index} is {students2[index].FirstName} {students2[index].LastName}");
        }
    }
}

Observe los dos pares de llaves de cada elemento de la colección en la primera declaración. Las llaves más internas contienen el inicializador de objeto para StudentName, mientras que las más externas contienen el inicializador para el par clave-valor que se agregará a studentsDictionary<TKey,TValue>. Por último, el inicializador completo de la colección para el diccionario se encierra entre llaves. En la segunda inicialización, el lado izquierdo de la asignación es la clave y el lado derecho es el valor, con un inicializador de objeto para StudentName.

Consulte también