2009-03-09 24 views
64

Qualcuno ha idea di quali siano le differenze pratiche tra l'oggetto System.Collections.Specialized.StringDictionary e System.Collections.Generic.Dictionary?StringDictionary vs Dictionary <string, string>

Li ho usati entrambi in passato senza pensarci troppo per ottenere prestazioni migliori, lavorare meglio con Linq o fornire altri vantaggi.

Qualche idea o suggerimento sul perché dovrei usarne uno sull'altro?

risposta

77

Dictionary<string, string> è un approccio più moderno. Implementa IEnumerable<T> ed è più adatto per le cose LINQy.

StringDictionary è il vecchio modo di scuola. Era lì prima dei giorni dei generici. Lo userei solo quando si interfaccia con il codice legacy.

+2

Ci sono differenze di prestazioni tra i due? – thecoop

+0

Dovresti fare un benchmark per vedere quale si comporta meglio per la tua situazione speciale. Non mi aspetto una notevole differenza di prestazioni. Raccomando di usare 'Dictionary ' per tutto il nuovo codice (a meno che non sia necessario il target 1.1). –

+1

@thecoop nessun dato difficile da presentare al mio fianco ora, ma una volta quando ho fatto test per la velocità 'StringDictionary' ha ottenuto risultati peggiori (anche se tutto ciò non ha importanza). Per essere onesto infatti, in precedenza avevo la nozione che "StringDictionary" fosse una sorta di raccolta specializzata pensata per accelerare le cose quando "string" era la chiave, e con mia grande sorpresa quando si è comportata peggio nei miei test, ho cercato solo su Google per imparare che non è generico, – nawfal

33

Penso che StringDictionary sia praticamente obsoleto. Esisteva nella versione 1.1 del framework (prima dei generici), quindi all'epoca era una versione superiore (rispetto al dizionario non generico), ma a questo punto, non credo ci siano vantaggi specifici ad esso sul dizionario.

Tuttavia, esistono degli svantaggi in StringDictionary. StringDictionary abbassa automaticamente i tuoi valori chiave e non ci sono opzioni per controllare questo.

Vedi:

http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/

+0

'StringDictionary' può essere usato in' Properites.Settings' mentre 'Dictionary ' non può. Così obsoleto o no, c'è ancora un po 'di uso per 'StringDictionary'. – jahu

36

Un altro punto.

Questo restituisce un valore nullo:

StringDictionary dic = new StringDictionary(); 
return dic["Hey"]; 

Questo genera un'eccezione:

Dictionary<string, string> dic = new Dictionary<string, string>(); 
return dic["Hey"]; 
+0

Il "getta un'eccezione" * funzione * di'Dictionary <> 'significa che non posso mai usare '[]'. Usa StringDictionary ha ripulito gran parte del mio codice. –

+0

@James Sono un po 'in ritardo ma probabilmente dovresti usare TryGetValue. –

+0

@ ŞafakGür - I * do * uso TryGetValue() - perché non posso mai usare '[]' perché genera un'eccezione. (StringDictionary risolve solo questo per un tipo di dizionari) –

1

Oltre ad essere una classe più "moderno", ho notato che dizionario è più efficiente della memoria di StringDictionary con un ampio margine .

+8

qui potremmo usare alcuni numeri – Zonko

29

Come sottolineato da Reed Copsey, StringDictionary sottovaluta i valori chiave. Per me questo è stato completamente inaspettato, ed è uno spettacolo-tappo.

private void testStringDictionary() 
{ 
    try 
    { 
     StringDictionary sd = new StringDictionary(); 
     sd.Add("Bob", "My name is Bob"); 
     sd.Add("joe", "My name is joe"); 
     sd.Add("bob", "My name is bob"); // << throws an exception because 
             // "bob" is already a key! 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

Sto aggiungendo questa risposta per attirare maggiore attenzione a questo enorme differenza, che IMO è più importante della moderna vs differenza della vecchia scuola.

+2

Se per qualche ragione si desidera lo stesso comportamento con Dizionario questo può essere usato: Dizionario ht = nuovo dizionario (StringComparer.OrdinalIgnoreCase); ht.Add ("Bob", "ff"); ht.Add ("bob", "ff"); // genera un'eccezione – osexpert

2

StringDictionary viene da .NET 1.1 e implementa IEnumerable

Dictionary<string, string> viene da .NET 2.0 e implementa IDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable

IgnoreCase è impostato solo per Digitare StringDictionary

Dictionary<string, string> è buono per LINQ

 Dictionary<string, string> dictionary = new Dictionary<string, string>(); 
     dictionary.Add("ITEM-1", "VALUE-1"); 
     var item1 = dictionary["item-1"];  // throws KeyNotFoundException 
     var itemEmpty = dictionary["item-9"]; // throws KeyNotFoundException 

     StringDictionary stringDictionary = new StringDictionary(); 
     stringDictionary.Add("ITEM-1", "VALUE-1"); 
     var item1String = stringDictionary["item-1"];  //return "VALUE-1" 
     var itemEmptystring = stringDictionary["item-9"]; //return null 

     bool isKey = stringDictionary.ContainsValue("VALUE-1"); //return true 
     bool isValue = stringDictionary.ContainsValue("value-1"); //return false 
1

Un altro punto di interesse rilevante nt è questo (correggimi se ho torto qui) System.Collections.Generic.Dictionary non può essere usato nelle impostazioni dell'applicazione (Properties.Settings) mentre System.Collections.Specialized.StringDictionary è.

Problemi correlati