qual è la differenza tra lista e dizionario in c #

Ho uno strano dubbio riguardo lista e dizionario in c #

In una lista aggiungiamo elementi alla lista usando il seguente metodo

using System.Collections.Generic; class Program { static void Main() { List list = new List(); list.Add(2); list.Add(3); list.Add(5); list.Add(7); } } 

In un dizionario aggiungiamo articoli come questo …

 using System; using System.Collections.Generic; class Program { static void Main() { Dictionary d = new Dictionary(); d.Add("cat", 2); d.Add("dog", 1); d.Add("llama", 0); d.Add("iguana", -1); } } 

Non so esattamente quale sia la differenza, ma in un dizionario aggiungiamo elementi come una coppia (chiave, valore) e in una lista aggiungiamo solo elementi senza specificare alcuna chiave.

Qualcuno potrebbe chiarirlo?

IDictionary è per le mappe chiave-> valore, ICollection è per insiemi di oggetti simili.

ICollection è un’interfaccia per raccolte di oggetti simili: i controlli su un modulo, gli elementi in un elenco, gli attributi in un tag XML e così via. A partire da .NET 2.0, esiste una versione generica, quindi è ansible fare riferimento a una raccolta di numeri interi come ICollection .

IDictionary è un’interfaccia per mappare un tipo di object o valore a un altro. Funziona come un vero dizionario o una rubrica: hai in mente una “chiave” come il nome di una persona, e quando la guardi, ottieni alcune informazioni identificate da quella chiave, come un indirizzo o un numero di telefono. Ogni chiave può essere elencata una sola volta, sebbene due chiavi diverse possano ancora avere lo stesso valore. Questo è anche generico in .NET 2.0, quindi un dizionario le cui chiavi sono stringhe e i cui valori sono numeri interi sarebbe IDictionary .

Un dizionario è in realtà un insieme di coppie chiave / valore: è ansible utilizzare un IDictionary come un ICollection> , ed è ansible accedere alle chiavi e ai valori come raccolte separate con le chiavi e i valori proprietà.

Sia ICollection che IDictionary non sono ordinati, il che significa che sebbene sia ansible recuperare gli elementi in un certo ordine con il metodo CopyTo o un ciclo foreach, quell’ordine non ha alcun significato speciale e potrebbe cambiare senza un motivo apparente. Questa è la principale differenza tra ICollection e IList : un elenco ti consente di mettere gli oggetti in posizioni specifiche, proprio come un array, e rimangono lì finché non li sposti.

List<> e Dictionary<,> – strutture di dati piuttosto diverse che vengono utilizzate per scopi diversi, Elenco è semplicemente un insieme di elementi e Dizionario è un insieme di coppie chiave-valore.

Il dizionario è molto utile quando si ha un insieme di oggetti complessi e si vuole avere un accesso rapido, ad esempio ObjectName / ObjectId, in questo caso si crea IDictionary dove la chiave sarebbe ObjectId e Value sarebbe un object stesso.

Alcune differenze:

  • Elenca l’ordine persistente degli elementi, il dizionario no
  • Elenco consente l’accesso rapido per indice
  • Elenco di supporto integrato nell’algoritmo QuickSort per l’ordinamento rapido dei dati
  • Il dizionario consente la complessità temporale di ~ O(1) per accedere a un elemento (valore) mediante una chiave
  • Dictionary è un array o una mappa associativa. È un contenitore che può essere indicizzato con valori di qualsiasi tipo.
  • List è un array con indice intero. È un contenitore che è indicizzato da interi contigui.

La differenza essenziale è quindi nel modo in cui i contenitori sono indicizzati.

Non cadere nella trappola di credere che Dictionary sia semanticamente equivalente a List . La differenza è che l’indicizzazione di List è contigua mentre ci possono essere lacune nell’indicizzazione per Dictionary .

Ho una libreria di classi che accede a una varietà di sprocs T-sql; ogni sproc restituisce una singola riga ma colonne diverse. Avevo bisogno di una soluzione generica per il recupero dei valori e il dizionario <> forniva una soluzione molto più pulita di Elenco <>.

La class comune a tutti i wrapper dichiara

 public Dictionary datadict = new Dictionary(); 

e

 public Dictionary LoadData(string sproc, string paramName, string paramValue) 

Richiamando un Reader, il datadict viene caricato con

 for (int i = Reader.FieldCount; i != 0; i--) { datadict.Add(Reader.GetName(i - 1).Trim(), Reader.GetString(i - 1).Trim()); } 

e restituisce il datadict alla class chiamante che può quindi recuperare i dati molto come fa Reader; Per esempio:

 datadict = myData.LoadData("spGetSSN", "", ""); ssn1 = datadict["SSN1"]; ssn2 = datadict["SSN2"]; ssn3 = datadict["SSN3"]; 

Molto più pulito per me quell’elenco <>.