Was ist der effizienteste Weg, um eine konstante (sich zur Laufzeit nie ändernde) Zuordnung von string
s zu int
s zu erstellen ?
Ich habe versucht, ein const Dictionary zu verwenden , aber das hat nicht geklappt.
Ich könnte einen unveränderlichen Wrapper mit entsprechender Semantik implementieren , aber das scheint immer noch nicht ganz richtig zu sein.
Für diejenigen, die gefragt haben, implementiere ich IDataErrorInfo in einer generierten Klasse und suche nach einer Möglichkeit, die Suche nach columnName in mein Array von Deskriptoren aufzunehmen.
Ich war mir nicht bewusst (Tippfehler beim Testen! D'oh!), Dass der Schalter Zeichenfolgen akzeptiert, also werde ich ihn verwenden. Vielen Dank!
c#
.net
collections
dictionary
constants
David Schmitt
quelle
quelle
Antworten:
Das Erstellen eines wirklich zur Kompilierungszeit generierten konstanten Wörterbuchs in C # ist keine einfache Aufgabe. Eigentlich erreicht keine der Antworten hier wirklich das.
Es gibt jedoch eine Lösung, die Ihren Anforderungen entspricht, wenn auch nicht unbedingt eine gute. Denken Sie daran, dass gemäß der C # -Spezifikation Switch-Case-Tabellen zu konstanten Hash-Sprungtabellen kompiliert werden. Das heißt, es handelt sich um konstante Wörterbücher, nicht um eine Reihe von if-else-Anweisungen. Betrachten Sie also eine Switch-Case-Anweisung wie folgt:
Genau das wollen Sie. Und ja, ich weiß, es ist hässlich.
quelle
Im aktuellen Rahmen gibt es nur wenige unveränderliche Sammlungen. Ich kann mir eine relativ schmerzfreie Option in .NET 3.5 vorstellen:
Verwendung
Enumerable.ToLookup()
- DieLookup<,>
Klasse ist unveränderlich (aber auf der rechten Seite mehrwertig). Sie können diesDictionary<,>
ganz einfach tun :quelle
quelle
Dies ist die nächste Sache, die Sie zu einem "CONST Dictionary" bekommen können:
Der Compiler ist intelligent genug, um den Code so sauber wie möglich zu erstellen.
quelle
Bei Verwendung von 4.5+ Framework würde ich ReadOnlyDictionary (auch ReadOnly Collection für Listen) verwenden, um schreibgeschützte Zuordnungen / Konstanten zu erstellen. Es wird folgendermaßen implementiert.
quelle
private static readonly Dictionary<string, string> _yourDictionaryName = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase) { { "One",1 }, { "Two",2 }, { "Three",3 }, };
So habe ich es gemacht.readonly Dictionary<TKey, TValue>
ist nicht gleichbedeutend mit aReadOnlyDictionary<TKey, TValue>
. Tatsächlich ist die Art und Weise, wie sie "schreibgeschützt" sind, ziemlich gegensätzlich. Siehe: dotnetfiddle.net/v0l4aA .Warum nicht Namespaces oder Klassen verwenden, um Ihre Werte zu verschachteln? Es mag unvollkommen sein, aber es ist sehr sauber.
Jetzt können Sie auf .ParentClass.FooDictionary.Key1 usw. zugreifen.
quelle
Es scheint keine unveränderliche Standardschnittstelle für Wörterbücher zu geben, daher scheint das Erstellen eines Wrappers leider die einzig vernünftige Option zu sein.
Bearbeiten : Marc Gravell hat das ILookup gefunden, das ich verpasst habe - so können Sie zumindest vermeiden, einen neuen Wrapper zu erstellen, obwohl Sie das Wörterbuch noch mit .ToLookup () transformieren müssen.
Wenn dies ein auf ein bestimmtes Szenario beschränktes Bedürfnis ist, sind Sie möglicherweise mit einer stärker auf Geschäftslogik ausgerichteten Schnittstelle besser dran:
quelle
Ich bin nicht sicher, warum dies niemand erwähnt hat, aber in C # verwende ich für Dinge, die ich nicht const zuweisen kann, statische schreibgeschützte Eigenschaften.
Beispiel:
quelle
Nur eine weitere Idee, da ich an eine Winforms-Combobox binde:
So erhalten Sie den int-Wert aus dem Anzeigenamen von :
Verwendung:
quelle
Warum nicht:
quelle