Hat jemand eine Idee, was die praktischen Unterschiede zwischen dem System.Collections.Specialized.StringDictionary-Objekt und System.Collections.Generic.Dictionary sind?
Ich habe sie beide in der Vergangenheit verwendet, ohne viel darüber nachzudenken, welche besser funktionieren, besser mit Linq zusammenarbeiten oder andere Vorteile bieten würden.
Irgendwelche Gedanken oder Vorschläge, warum ich einen über den anderen verwenden sollte?
generics
.net-3.5
collections
dictionary
stringdictionary
Scott Ivey
quelle
quelle
Dictionary<string,string>
für den gesamten neuen Code (es sei denn, Sie müssen auf 1.1 abzielen).StringDictionary
schlechter abgeschnitten (obwohl all das meistens nicht wichtig ist). Um ehrlich zu sein, hatte ich früher die Vorstellung, dassStringDictionary
es sich um eine spezialisierte Sammlung handelt, die dazu gedacht ist, die Dinge zu beschleunigen, wenn diesstring
der Schlüssel war, und zu meiner großen Überraschung, als sie bei meinen Tests schlechter abschnitt, habe ich sie nur gegoogelt, um zu erfahren, dass sie nicht generisch istEin weiterer Punkt.
Dies gibt null zurück:
StringDictionary dic = new StringDictionary(); return dic["Hey"];
Dies löst eine Ausnahme aus:
Dictionary<string, string> dic = new Dictionary<string, string>(); return dic["Hey"];
quelle
Dictionary<>
Mittel i nie verwenden können[]
. Use StringDictionary hat einen Großteil meines Codes bereinigt.[ ]
weil es eine Ausnahme auslöst. (StringDictionary löst dies nur für eine Art von Wörterbüchern)Ich denke, StringDictionary ist ziemlich veraltet. Es existierte in Version 1.1 des Frameworks (vor Generika), daher war es zu dieser Zeit eine überlegene Version (im Vergleich zum nicht generischen Wörterbuch), aber an diesem Punkt glaube ich nicht, dass es irgendwelche spezifischen Vorteile gibt über Wörterbuch.
StringDictionary hat jedoch Nachteile. StringDictionary schreibt Ihre Schlüsselwerte automatisch in Kleinbuchstaben, und es gibt keine Optionen, um dies zu steuern.
Sehen:
http://social.msdn.microsoft.com/forums/en-US/netfxbcl/thread/59f38f98-6e53-431c-a6df-b2502c60e1e9/
quelle
StringDictionary
kann verwendet werden,Properites.Settings
solangeDictionary<string,string>
nicht. So veraltet oder nicht, es gibt immer noch eine Verwendung fürStringDictionary
.Wie Reed Copsey betonte, schreibt StringDictionary Ihre Schlüsselwerte in Kleinbuchstaben. Für mich war das völlig unerwartet und ist ein Show-Stopper.
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); } }
Ich füge diese Antwort hinzu, um mehr Aufmerksamkeit auf diesen großen Unterschied zu lenken , der IMO wichtiger ist als der Unterschied zwischen moderner und alter Schule.
quelle
StringDictionary
kommt aus .NET 1.1 und implementiertIEnumerable
Dictionary<string, string>
kommt aus .NET 2.0 und implementiertIDictionary<TKey, TValue>,IEnumerable<KeyValuePair<TKey, TValue>>, IEnumerable
IgnoreCase ist nur für Key in eingestellt
StringDictionary
Dictionary<string, string>
ist gut für LINQDictionary<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
quelle
Abgesehen davon, dass es sich um eine "modernere" Klasse handelt, habe ich festgestellt, dass Dictionary mit großem Abstand speichereffizienter als StringDictionary ist.
quelle
Ein weiterer relevanter Punkt ist, dass (korrigieren Sie mich, wenn ich mich hier irre)
System.Collections.Generic.Dictionary
nicht in den Anwendungseinstellungen (Properties.Settings
) verwendet werden kann, wohingegen dies der FallSystem.Collections.Specialized.StringDictionary
ist.quelle