Raccolte e strutture di datiCollections and Data Structures

Dati simili possono spesso essere gestiti in modo più efficiente quando memorizzati e modificati come una raccolta.Similar data can often be handled more efficiently when stored and manipulated as a collection. È possibile usare la classe System.Array o le classi negli spazi dei nomi System.Collections, System.Collections.Generic, System.Collections.Concurrent e System.Collections.Immutable per aggiungere, rimuovere e modificare singoli elementi o un intervallo di elementi nella raccolta.You can use the System.Array class or the classes in the System.Collections, System.Collections.Generic, System.Collections.Concurrent, System.Collections.Immutable namespaces to add, remove, and modify either individual elements or a range of elements in a collection.

Esistono due tipi principali di raccolte: raccolte generiche e raccolte non generiche.There are two main types of collections; generic collections and non-generic collections. Le raccolte generiche sono state aggiunte in.NET Framework 2.0 e sono indipendenti dai tipi in fase di compilazione.Generic collections were added in the .NET Framework 2.0 and provide collections that are type-safe at compile time. Per questo motivo, le raccolte generiche offrono in genere prestazioni migliori.Because of this, generic collections typically offer better performance. Le raccolte generiche accettano un parametro di tipo quando vengono costruite e non è necessario eseguire il cast da e verso il tipo Object quando si aggiungono o rimuovono elementi dalla raccolta.Generic collections accept a type parameter when they are constructed and do not require that you cast to and from the Object type when you add or remove items from the collection. Inoltre, gran parte delle raccolte generiche sono supportate nelle applicazioni Windows StoreWindows Store.In addition, most generic collections are supported in Windows StoreWindows Store apps. Le raccolte non generiche memorizzano elementi come Object, richiedono il cast e molte non sono supportate per lo sviluppo di applicazioni Windows StoreWindows Store.Non-generic collections store items as Object, require casting, and most are not supported for Windows StoreWindows Store app development. Tuttavia, si possono vedere raccolte non generiche nel codice precedente.However, you may see non-generic collections in older code.

A partire da .NET Framework 4.NET Framework 4, le raccolte nello spazio dei nomi System.Collections.Concurrent forniscono operazioni thread-safe efficienti per accedere agli elementi della raccolta da più thread.Starting with the .NET Framework 4.NET Framework 4, the collections in the System.Collections.Concurrent namespace provide efficient thread-safe operations for accessing collection items from multiple threads. Le classi di raccolte non modificabili dello spazio dei nomi System.Collections.Immutable (Pacchetto NuGet) sono intrinsecamente thread-safe, perché le operazioni vengono eseguite su una copia della raccolta originale, che non può essere modificata.The immutable collection classes in the System.Collections.Immutable namespace (NuGet package) are inherently thread-safe because operations are performed on a copy of the original collection and the original collection cannot be modified.

Funzionalità comuni delle raccolteCommon collection features

Tutte le raccolte forniscono metodi per l'aggiunta, la rimozione o la ricerca di elementi nella raccolta.All collections provide methods for adding, removing or finding items in the collection. In aggiunta, tutte le raccolte che implementano direttamente o indirettamente l'interfaccia ICollection o l'interfaccia ICollection<T> condividono le funzionalità seguenti:In addition, all collections that directly or indirectly implement the ICollection interface or the ICollection<T> interface share these features:

  • La possibilità di enumerare la raccoltaThe ability to enumerate the collection

    Le raccolte di .NET Framework implementano System.Collections.IEnumerable oppure System.Collections.Generic.IEnumerable<T> per consentire l'iterazione della raccolta..NET Framework collections either implement System.Collections.IEnumerable or System.Collections.Generic.IEnumerable<T> to enable the collection to be iterated through. Un enumeratore può essere considerato come un puntatore che si sposta a qualsiasi elemento nella raccolta.An enumerator can be thought of as a movable pointer to any element in the collection. Le istruzioni foreach, in e For Each...Next usano l'enumeratore esposto dal metodo GetEnumerator e nascondono la complessità di gestione dell'enumeratore.The foreach, in statement and the For Each...Next Statement use the enumerator exposed by the GetEnumerator method and hide the complexity of manipulating the enumerator. Inoltre, qualsiasi raccolta che implementi System.Collections.Generic.IEnumerable<T> viene considerata un tipo queryable e può essere sottoposta a query con LINQ.In addition, any collection that implements System.Collections.Generic.IEnumerable<T> is considered a queryable type and can be queried with LINQ. Le query LINQ forniscono un modello comune per l'accesso ai dati.LINQ queries provide a common pattern for accessing data. In genere sono più concise e leggibili dei cicli foreach standard e forniscono funzionalità di filtro, ordinamento e raggruppamento.They are typically more concise and readable than standard foreach loops, and provide filtering, ordering and grouping capabilities. Le query LINQ possono inoltre migliorare le prestazioni.LINQ queries can also improve performance. Per altre informazioni, vedere LINQ to Objects, Parallel LINQ (PLINQ) e Introduzione alle query LINQ (C#).For more information, see LINQ to Objects, Parallel LINQ (PLINQ) and Introduction to LINQ Queries (C#).

  • La possibilità di copiare il contenuto della raccolta in una matriceThe ability to copy the collection contents to an array

    Tutti le raccolte possono essere copiate in una matrice usando il metodo CopyTo. Tuttavia, l'ordine degli elementi nella nuova matrice si basa sulla sequenza in cui vengono restituiti dall'enumeratore.All collections can be copied to an array using the CopyTo method; however, the order of the elements in the new array is based on the sequence in which the enumerator returns them. La matrice risultante è sempre unidimensionale con limite inferiore pari a zero.The resulting array is always one-dimensional with a lower bound of zero.

Inoltre, molte classi di raccolte contengono le seguenti funzionalità:In addition, many collection classes contain the following features:

  • Proprietà capacità e conteggioCapacity and Count properties

    La capacità di una raccolta è il numero di elementi che può contenere.The capacity of a collection is the number of elements it can contain. Il conteggio di una raccolta è il numero di elementi che contiene effettivamente.The count of a collection is the number of elements it actually contains. Alcune raccolte nascondono la capacità o il conteggio oppure entrambi.Some collections hide the capacity or the count or both.

    La capacità della maggior parte delle raccolte si espande automaticamente quando viene raggiunta la capacità corrente.Most collections automatically expand in capacity when the current capacity is reached. La memoria viene riallocata e gli elementi vengono copiati dalla raccolta precedente a quella nuova.The memory is reallocated, and the elements are copied from the old collection to the new one. Ciò riduce la quantità di codice necessario per usare la raccolta. Tuttavia, le prestazioni della raccolta possono essere influenzate negativamente.This reduces the code required to use the collection; however, the performance of the collection might be negatively affected. Ad esempio, per List<T>, se Count è minore di Capacity, l'aggiunta di un elemento è un'operazione O(1).For example, for List<T>, If Count is less than Capacity, adding an item is an O(1) operation. Se la capacità deve essere incrementata per far posto al nuovo elemento, l'aggiunta di un elemento diventa un'operazione O(n), dove n è Count.If the capacity needs to be increased to accommodate the new element, adding an item becomes an O(n) operation, where n is Count. Il modo migliore per evitare una riduzione delle prestazioni causata da più riallocazioni consiste nell'impostare la capacità iniziale sulla dimensione prevista della raccolta.The best way to avoid poor performance caused by multiple reallocations is to set the initial capacity to be the estimated size of the collection.

    Un BitArray è un caso speciale: la sua capacità corrisponde alla sua lunghezza, che corrisponde al relativo conteggio.A BitArray is a special case; its capacity is the same as its length, which is the same as its count.

  • Un limite inferiore coerenteA consistent lower bound

    Il limite inferiore di una raccolta è l'indice del primo elemento.The lower bound of a collection is the index of its first element. Tutte le raccolte indicizzate negli spazi dei nomi System.Collections hanno un limite inferiore pari a zero, ossia possono essere indicizzate da 0.All indexed collections in the System.Collections namespaces have a lower bound of zero, meaning they are 0-indexed. Array ha un limite inferiore pari a zero per impostazione predefinita, ma è possibile definire un limite inferiore differente durante la creazione di un'istanza della classe Array con Array.CreateInstance.Array has a lower bound of zero by default, but a different lower bound can be defined when creating an instance of the Array class using Array.CreateInstance.

  • Sincronizzazione per l'accesso da più thread (solo classi System.Collections).Synchronization for access from multiple threads (System.Collections classes only).

    I tipi di raccolta non generica nello spazio dei nomi System.Collections forniscono una determinata thread safety con la sincronizzazione, in genere esposte attraverso i membri SyncRoot e IsSynchronized.Non-generic collection types in the System.Collections namespace provide some thread safety with synchronization; typically exposed through the SyncRoot and IsSynchronized members. Queste raccolte non sono thread-safe per impostazione predefinita.These collections are not thread-safe by default. Se si richiede un accesso multithreading scalabile ed efficiente a una raccolta, usare una delle classi nello spazio dei nomi System.Collections.Concurrent o considerare l'uso di una raccolta non modificabile.If you require scalable and efficient multi-threaded access to a collection, use one of the classes in the System.Collections.Concurrent namespace or consider using an immutable collection. Per altre informazioni, vedere Raccolte thread-safe.For more information, see Thread-Safe Collections.

Scelta di una raccoltaChoosing a collection

In generale, è necessario usare raccolte generiche.In general, you should use generic collections. Nella tabella seguente vengono descritti alcuni scenari comuni di raccolta e le classi di raccolta che è possibile usare per gli scenari.The following table describes some common collection scenarios and the collection classes you can use for those scenarios. Se si ha già familiarità con le raccolte generiche, questa tabella consente di scegliere la raccolta generica più adatta alla propria attività.If you are new to generic collections, this table will help you choose the generic collection that works the best for your task.

Si desidera...I want to… Opzioni di raccolta genericaGeneric collection options Opzioni di raccolta non genericaNon-generic collection options Opzioni di raccolta thread-safe o non modificabileThread-safe or immutable collection options
Archiviare gli elementi come coppie chiave/valore per la ricerca rapida dalla chiaveStore items as key/value pairs for quick look-up by key Dictionary<TKey,TValue> Hashtable

(Una raccolta di coppie chiave/valore che sono organizzate in base al codice hash della chiave).(A collection of key/value pairs that are organize based on the hash code of the key.)
ConcurrentDictionary<TKey,TValue>

ReadOnlyDictionary<TKey,TValue>

ImmutableDictionary<TKey,TValue>
Accedere agli elementi in base all'indiceAccess items by index List<T> Array

ArrayList
ImmutableList<T>

ImmutableArray
Usare gli elementi first-in-first-out (FIFO)Use items first-in-first-out (FIFO) Queue<T> Queue ConcurrentQueue<T>

ImmutableQueue<T>
Usare i dati Last-In-First-Out (LIFO)Use data Last-In-First-Out (LIFO) Stack<T> Stack ConcurrentStack<T>

ImmutableStack<T>
Accedere agli elementi in sequenzaAccess items sequentially LinkedList<T> Nessuna raccomandazioneNo recommendation Nessuna raccomandazioneNo recommendation
Ricevere notifiche quando gli elementi vengono rimossi o aggiunti alla raccolta.Receive notifications when items are removed or added to the collection. (implementa INotifyPropertyChanged e INotifyCollectionChanged)(implements INotifyPropertyChanged and INotifyCollectionChanged) ObservableCollection<T> Nessuna raccomandazioneNo recommendation Nessuna raccomandazioneNo recommendation
Una raccolta ordinataA sorted collection SortedList<TKey,TValue> SortedList ImmutableSortedDictionary<TKey,TValue>

ImmutableSortedSet<T>
Un set di funzioni matematicheA set for mathematical functions HashSet<T>

SortedSet<T>
Nessuna raccomandazioneNo recommendation ImmutableHashSet<T>

ImmutableSortedSet<T>

TitoloTitle DescrizioneDescription
Selezione di una classe CollectionSelecting a Collection Class Vengono descritte le diverse raccolte e come selezionarne una per lo scenario.Describes the different collections and helps you select one for your scenario.
Tipi di raccolte comunemente utilizzateCommonly Used Collection Types Vengono descritti i tipi di raccolta generici e non generici comunemente usati, quali System.Array, System.Collections.Generic.List<T> e System.Collections.Generic.Dictionary<TKey,TValue>.Describes commonly used generic and nongeneric collection types such as System.Array, System.Collections.Generic.List<T>, and System.Collections.Generic.Dictionary<TKey,TValue>.
Quando utilizzare raccolte genericheWhen to Use Generic Collections Viene illustrato l'utilizzo di tipi di raccolta generici.Discusses the use of generic collection types.
Confronti e ordinamenti all'interno delle raccolteComparisons and Sorts Within Collections Viene illustrato l'utilizzo di confronti di uguaglianza e ordinamento nelle raccolte.Discusses the use of equality comparisons and sorting comparisons in collections.
Tipi di raccolta ordinatiSorted Collection Types Vengono descritte le caratteristiche e le prestazioni di raccolte ordinateDescribes sorted collections performance and characteristics
Tipi di Collection Hashtable e DictionaryHashtable and Dictionary Collection Types Vengono descritte le funzionalità dei tipi di dizionario basati su hash generici e non generici.Describes the features of generic and non-generic hash-based dictionary types.
Raccolte thread-safeThread-Safe Collections Vengono descritti i tipi di raccolta quali System.Collections.Concurrent.BlockingCollection<T> e System.Collections.Concurrent.ConcurrentBag<T> che supportano l'accesso simultaneo sicuro ed efficiente da più thread.Describes collection types such as System.Collections.Concurrent.BlockingCollection<T> and System.Collections.Concurrent.ConcurrentBag<T> that support safe and efficient concurrent access from multiple threads.
System.Collections.ImmutableSystem.Collections.Immutable Introduce le raccolte non modificabili e fornisce collegamenti ai tipi di raccolta.Introduces the immutable collections and provides links to the collection types.

RiferimentiReference

System.Array
System.Collections
System.Collections.Concurrent
System.Collections.Generic
System.Collections.Specialized
System.Linq
System.Collections.Immutable