Como inicializar um dicionário com um inicializador de coleção (Guia de Programação em C#)
A Dictionary<TKey,TValue> contém uma coleção de pares chave/valor. Seu Add método usa dois parâmetros, um para a chave e outro para o valor. Uma maneira de inicializar um Dictionary<TKey,TValue>, ou qualquer coleção cujo Add
método usa vários parâmetros, é incluir cada conjunto de parâmetros em chaves, conforme mostrado no exemplo a seguir. Outra opção é usar um inicializador de índice, também mostrado no exemplo a seguir.
Nota
A principal diferença entre essas duas maneiras de inicializar a coleção é que, no caso de ter chaves duplicadas, por exemplo:
{ 111, new StudentName { FirstName="Sachin", LastName="Karnik", ID=211 } },
{ 111, new StudentName { FirstName="Dina", LastName="Salimzianova", ID=317 } },
Add método lançará ArgumentException: 'An item with the same key has already been added. Key: 111'
, enquanto a segunda parte do exemplo, o método indexador público de leitura/gravação, substituirá silenciosamente a entrada já existente com a mesma chave.
Exemplo
No exemplo de código a seguir, a Dictionary<TKey,TValue> é inicializado com instâncias do tipo StudentName
. A primeira inicialização usa o Add
método com dois argumentos. O compilador gera uma chamada para Add
cada um dos pares de int
chaves e StudentName
valores. O segundo usa um método indexador público de leitura/gravação da Dictionary
classe:
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 os dois pares de chaves em cada elemento da coleção na primeira declaração. As chaves mais internas incluem o inicializador de objeto para o StudentName
, e as chaves mais externas incluem o inicializador para o par chave/valor a ser adicionado ao students
Dictionary<TKey,TValue>. Finalmente, todo o inicializador da coleção para o dicionário está incluído em chaves. Na segunda inicialização, o lado esquerdo da atribuição é a chave e o lado direito é o valor, usando um inicializador de objeto para StudentName
.