Condividi tramite


Come inizializzare un dizionario con un inizializzatore di insieme (Guida per programmatori C#)

Un oggetto Dictionary<TKey,TValue> contiene una raccolta di coppie chiave-valore. Il relativo metodo Add accetta due parametri, uno per la chiave e uno per il valore. Un modo per inizializzare un oggetto Dictionary<TKey,TValue> o qualsiasi raccolta il cui metodo Add accetta più parametri, consiste nel racchiudere ogni set di parametri tra parentesi graffe, come illustrato nell'esempio seguente. Un'altra opzione consiste nell'usare un inizializzatore di indice, come mostrato nell'esempio seguente.

Nota

La differenza principale tra questi due modi per inizializzare la raccolta è la modalità di gestione delle chiavi duplicate, ad esempio:

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

Add metodo genera ArgumentException: 'An item with the same key has already been added. Key: 111', mentre la seconda parte dell'esempio, il metodo pubblico di lettura/scrittura dell'indicizzatore, sovrascrive in modo silenzioso la voce già esistente con la stessa chiave.

Esempio

Nell'esempio di codice seguente, viene inizializzato un oggetto Dictionary<TKey,TValue> con istanze di tipo StudentName. La prima inizializzazione usa il metodo Add con due argomenti. Il compilatore genera una chiamata a Add per ognuna delle coppie di chiavi int e valori StudentName. Il secondo utilizza un metodo indicizzatore pubblico di lettura e scrittura della classe 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}");
        }
    }
}

Si noti che vi sono due coppie di parentesi graffe in ogni elemento della raccolta nella prima dichiarazione. Le parentesi più interne racchiudono l'inizializzatore di oggetto per StudentName, mentre quelle più esterne racchiudono l'inizializzatore per la coppia chiave/valore che viene aggiunta a studentsDictionary<TKey,TValue>. Infine, l'intero inizializzatore di collezione per il dizionario è racchiuso tra parentesi graffe. Durante la seconda inizializzazione, il lato sinistro dell'assegnazione è la chiave e il lato destro è il valore, usando un inizializzatore di oggetto per StudentName.

Usare l'intelligenza artificiale per generare dati di test per le raccolte di dizionario

È possibile usare strumenti di intelligenza artificiale, ad esempio GitHub Copilot, per generare rapidamente scenari di test e convalida del dizionario nei progetti C#.

Ecco un esempio di richiesta che è possibile usare in Visual Studio Copilot Chat.

Generate data collections for tests to create a separate Dictionary<int, Student> containing 10 valid Student records and 5 invalid records. 
- Valid records should have realistic Name and Grade values.
- Invalid records should include cases such as missing Name, Grade < 0, or Grade > 100. 
- This dictionary should be used only for testing purposes and not modify existing production code.
- Generate test code that utilizes this test data for validation scenarios.
- Call test method to run the test.

Esaminare i suggerimenti di Copilot prima di applicarli.

Per altre informazioni su GitHub Copilot, vedere Domande frequenti su GitHub.

Vedi anche