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:
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 <>.