Esercitazione sulle raccolte C# con esempi

โšก Riepilogo intelligente

In C#, le collezioni offrono un modo flessibile per archiviare e gestire gruppi di oggetti. A differenza degli array, le collezioni si espandono e si riducono in fase di esecuzione, e gli spazi dei nomi System.Collections e System.Collections.Generic forniscono tipi predefiniti per liste, dizionari, stack e code.

  • ๐Ÿ”ƒ Dimensionamento dinamico: Le collezioni aggiungono e rimuovono elementi in fase di esecuzione, quindi non รจ necessario definire la dimensione in anticipo come nel caso degli array.
  • ๐Ÿ“š Namespace: System.Collections contiene i tipi non generici, mentre System.Collections.Generic contiene i tipi generici con controllo dei tipi.
  • ๐Ÿงฑ Corsi principali: ArrayList, Stack, Queue, Hashtable, SortedList e BitArray coprono le esigenze comuni non generiche.
  • โœ… Potenza generica: List, Dictionary, HashSet e Queue aggiungono sicurezza dei tipi in fase di compilazione e prestazioni migliori.
  • ๐Ÿ”‘ Scelta giusta: Utilizza un dizionario per le ricerche chiave, una lista per gli elementi ordinati e una pila o una coda per l'ordinamento LIFO o FIFO.
  • ๐Ÿค– Assistenza AI: GitHub Copilot genera il codice per la raccolta dati, mentre le pipeline ML.NET trasmettono i dati attraverso tipi di raccolta generici.

Collezioni in C#

Nel nostro tutorial precedente, abbiamo imparato come utilizzare gli array in C#. Diamo una rapida panoramica di esso, gli array nella programmazione vengono utilizzati per raggruppare un insieme di oggetti correlati. Quindi si potrebbe creare un array o un insieme di numeri interi, a cui รจ possibile accedere tramite un nome di variabile.

Che cosa sono le raccolte in C#?

Le raccolte sono simili a Array, fornisce un modo piรน flessibile di lavorare con un gruppo di oggetti.

Negli array, avresti notato che รจ necessario definire in anticipo il numero di elementi in un array. Questo doveva essere fatto quando l'array veniva dichiarato.

Ma in una raccolta non รจ necessario definire in anticipo la dimensione della raccolta. Puoi aggiungere elementi o persino rimuovere elementi dalla raccolta in qualsiasi momento. Questo capitolo si concentrerร  su come possiamo lavorare con le diverse raccolte disponibili in C#.

Classi System.Collections

Il .NET Framework raggruppa le classi di collezioni originali non generiche all'interno dello spazio dei nomi System.Collections. La tabella seguente riassume i tipi principali che รจ possibile utilizzare immediatamente.

Collezione Descrizione
Lista di array La raccolta ArrayList รจ simile agli Array tipo di dati in C#. La differenza piรน grande รจ la natura dinamica della raccolta dell'elenco di array.
pila La pila รจ una collezione di casi particolari che rappresenta il concetto di ultimo entrato, primo uscito (LIFO).
code La Queue รจ una collezione di custodie speciali che si basa sul principio "primo entrato, primo uscito".
tabella hash Una tabella hash รจ una particolare collezione utilizzata per memorizzare coppie chiave-valore.
Elenco ordinato SortedList รจ una raccolta che memorizza coppie chiave-valore nell'ordine crescente della chiave per impostazione predefinita.
BitArray Un array di bit รจ un array di strutture dati che memorizza bit.

Collezioni generiche in C#

Le classi non generiche sopra menzionate memorizzano ogni elemento come un oggetto generico, il che significa che il compilatore non puรฒ controllare il tipo e il programma paga un piccolo costo per il boxing dei valori. Per risolvere questo problema, C# ha aggiunto lo spazio dei nomi System.Collections.Generic, in cui ogni collezione รจ associata a un tipo dichiarato.

Una raccolta generica come Elenco Accetta solo stringhe, quindi gli errori vengono rilevati in fase di compilazione e non รจ necessario alcun casting quando si legge un elemento. Questo rende le collezioni generiche piรน sicure, veloci e facili da leggere, motivo per cui sono la scelta predefinita nel codice C# moderno.

Di seguito sono elencate le collezioni generiche piรน comuni:

  • Lista : Una lista ridimensionabile basata su indice, che rappresenta il sostituto generico di ArrayList.
  • Dizionario : Memorizza coppie chiave-valore con ricerche rapide basate su hash.
  • HashSet : Contiene solo valori univoci e supporta operazioni sugli insiemi come l'unione.
  • Coda : Una collezione "primo entrato, primo uscito", la versione generica di Queue.
  • Pila : Una collezione LIFO (Last In First Out), la versione generica di Stack.
  • Elenco ordinato : Mantiene le coppie chiave-valore ordinate per chiave in ordine crescente.

Esempio di collezione List in C#

La List รจ la collezione generica piรน utilizzata perchรฉ si comporta come un array dinamico. L'esempio seguente crea una lista di stringhe, aggiunge e rimuove elementi, ne legge la dimensione e infine stampa i valori rimanenti. Tutto il codice รจ scritto nel file Program.cs.

Passo 1) Importa lo spazio dei nomi System.Collections.Generic e dichiara un elenco di stringhe.

Passo 2) Aggiungi elementi con il metodo Add ed eliminane uno con il metodo Remove.

Passo 3) Leggi la proprietร  Count, quindi scorri l'elenco con un'istruzione foreach.

using System;
using System.Collections.Generic;
namespace DemoApplication
{
 class Program
 {
  static void Main(string[] args)
  {
   List<string> tutorials = new List<string>();
   tutorials.Add("Java");
   tutorials.Add("Python");
   tutorials.Add("Kotlin");
   tutorials.Remove("Python");
   Console.WriteLine(tutorials.Count);
   foreach (string tutorial in tutorials)
   {
    Console.WriteLine(tutorial);
   }
   Console.ReadKey();
  }
 }
}

Code Spiegazione:-

  1. Lo spazio dei nomi System.Collections.Generic viene importato in modo che il tipo List sia disponibile per il programma.
  2. Una nuova lista Viene creato un oggetto chiamato tutorials e con il metodo Add vengono aggiunti tre nomi.
  3. Il metodo Remove elimina il valore โ€œPython", il che lascia due elementi nell'elenco.
  4. La proprietร  Count restituisce il numero di elementi e il ciclo foreach stampa ciascun valore rimanente in ordine.

Quando il programma viene eseguito, stampa prima il conteggio di 2, seguita da Java and Kotlin su righe separate. Questo mostra come una collezione modifichi le sue dimensioni in fase di esecuzione, cosa che un array a dimensione fissa non puรฒ fare.

Differenza tra array e collezioni in C#

Sia un schieramento e una raccolta di elementi correlati sotto un unico nome, ma che si comportano in modo diverso una volta che il programma รจ in esecuzione. Sapere quando usare l'uno o l'altro aiuta a scrivere codice piรน pulito ed efficiente.

Le principali differenze sono elencate di seguito:

  • Dimensioni: Un array ha una lunghezza fissa impostata al momento della dichiarazione, mentre una collezione puรฒ espandersi o ridursi in qualsiasi momento.
  • Gestione dei tipi: Un array memorizza un singolo tipo, mentre una collezione puรฒ essere sicura dal punto di vista dei tipi grazie ai generici oppure contenere oggetti di tipi misti quando non sono generici.
  • Sede: Gli array sono integrati nel linguaggio, mentre le classi di collezioni risiedono negli spazi dei nomi System.Collections e System.Collections.Generic.
  • Operazioni integrate: Le collezioni offrono metodi immediati per aggiungere, rimuovere, cercare e ordinare elementi, mentre gli array forniscono solo un accesso indicizzato di base.
  • ultimi utilizzi: Scegli un array quando il numero di elementi รจ noto e fisso, e una collezione quando il conteggio cambia durante l'esecuzione del programma.

In sintesi, gli array sono ideali per dati di dimensioni fisse, mentre le collezioni offrono la flessibilitร  necessaria alla maggior parte delle applicazioni reali.

DOMANDE FREQUENTI

Utilizza un dizionario quando hai bisogno di ricerche rapide tramite una chiave univoca, come un ID associato a un record. Trova i valori in un tempo pressochรฉ costante, mentre una lista deve scansionare gli elementi uno per uno.

HashSet e Dictionary offrono le ricerche piรน veloci perchรฉ utilizzano l'hashing per raggiungere un elemento in un tempo pressochรฉ costante. Una List o un array sono piรน lenti perchรฉ potrebbero dover controllare ogni elemento in sequenza.

Le collezioni concorrenti risiedono nello spazio dei nomi System.Collections.Concurrent e sono progettate per il codice multithread. Tipi come ConcurrentDictionary e BlockingCollection consentono a piรน thread di aggiungere e rimuovere elementi in modo sicuro senza blocchi manuali.

IEnumerable รจ l'interfaccia di base che supporta solo la lettura di elementi tramite un ciclo foreach. ICollection la estende aggiungendo membri come Count, Add e Remove, supportando quindi anche la modifica della collezione.

List รจ una collezione generica e con tipizzazione sicura che memorizza un tipo dichiarato, offrendo controlli in fase di compilazione e prestazioni migliori. ArrayList non รจ generica e memorizza ogni elemento come un oggetto, il che richiede un casting e consente tipi misti.

Una pila (Stack) funziona secondo l'ordine LIFO (Last In First Out), quindi l'elemento piรน recente viene rimosso per primo tramite l'operazione Pop. Una coda (Queue) funziona secondo l'ordine FIFO (First In First Out), quindi l'elemento piรน vecchio viene rimosso per primo tramite l'operazione Dequeue.

Sรฌ. GitHub Copilot puรฒ suggerire il tipo di collezione corretto, generare cicli che aggiungono o filtrano elementi e completare query LINQ a partire da un breve commento, velocizzando cosรฌ il lavoro con liste, dizionari e altre collezioni.

ML.NET alimenta i dati di addestramento tramite collezioni come List e IEnumerable, che vengono mappate alla pipeline IDataView. L'archiviazione dei campioni in una collezione generica fortemente tipizzata mantiene il flusso di lavoro di machine learning chiaro e sicuro dal punto di vista dei tipi.

Riassumi questo post con: