2008-10-09 16 views
19

verwenden Wenn ich einen Groß- und Kleinschreibung String-Schlüssel Wörterbuch, haben will, welche Version von StringComparer soll ich diese Einschränkungen gegeben verwenden:Welche Version von StringComparer

  • Die Schlüssel im Wörterbuch von entweder C# -Code kommen oder Konfigurationsdateien nur in Englisch locale geschrieben (entweder US oder UK)
  • die Software internationalisiert und wird in verschiedenen Gegenden
  • läuft

ich normalerweise StringComparer.InvariantCultureIgnoreCase verwenden war aber nicht sicher, ob das die richtige ist Fall. Es folgt ein Beispielcode:

Dictionary< string, object> stuff = new Dictionary< string, object>(StringComparer.InvariantCultureIgnoreCase); 

Antwort

11

This MSDN article alles deckt Sie möglicherweise in großer Tiefe wissen wollen könnte, einschließlich der türkisch-I Problem.

Es ist eine Weile her, seit ich es gelesen habe, also mache ich es wieder. Sehe dich in einer Stunde!

1

Da die Tasten Ihre bekannten festen Werte sind, dann entweder InvariantCultureIgnoreCase oder OrdinalIgnoreCase funktionieren sollte. Vermeiden Sie die kulturspezifische, oder Sie könnten einige der mehr "Spaß" Dinge wie das "Türkisch i" -Problem treffen. Offensichtlich würden Sie einen kultivierten Vergleich verwenden, wenn Sie kultivierte Werte vergleichen ... aber es klingt wie Sie nicht sind.

3

Das Konzept der "case insensitive" ist ein linguistisches, und so macht es keinen Sinn ohne eine Kultur.

Weitere Informationen finden Sie unter blog.

Das heißt, wenn Sie nur über Strings mit dem lateinischen Alphabet sprechen, dann werden Sie wahrscheinlich mit der InvariantCulture durchkommen.

Es ist wahrscheinlich am besten, das Wörterbuch mit StringComparer.CurrentCulture zu erstellen. Dadurch kann "ß" beispielsweise in einer deutschen Kultur "ss" in Ihrem Wörterbuch finden.

1

StringComparer.OrdinalIgnoreCase ist etwas schneller als InvariantCultureIgnoreCase FWIW („Ein Ordinalvergleich ist schnell, aber kulturunabhängige“ MSDN nach.

Sie haben würden viele Vergleiche zu tun, den Unterschied von bemerken natürlich.

0

die invariante Kultur existiert speziell mit Streichern beschäftigen, die an das Programm intern sind und nichts mit Benutzerdaten oder UI zu tun. Es klingt wie dies der Fall für diese Situation ist.

27

Es gibt drei Arten von Vergleichern:

  • Kultur-aware
  • Kultur invariant
  • Ordinal

Jeder comparer hat eine case-sensitive sowie eine Groß- und Kleinschreibung Version.

Ein Ordinal der Vergleich verwendet Ordinalwerte von Zeichen. Dies ist der schnellste Vergleich, er sollte für interne Zwecke verwendet werden.

Ein kulturbewusster Vergleich berücksichtigt Aspekte, die spezifisch für die Kultur des aktuellen Threads sind. Es kennt die Probleme "Türkisch i", "Spanisch LL" usw. Es sollte für UI-Zeichenfolgen verwendet werden.

Die Kultur Invariante Vergleich ist eigentlich nicht definiert und kann unvorhersehbare Ergebnisse produzieren, und sollte daher nie verwendet werden.

Referenzen

  1. New Recommendations for Using Strings in Microsoft .NET 2.0
+0

das war nett und süß. Ein Fall, in dem ich invariante Kultur bevorzuge, ist wann schau in db .. – nawfal

0

System.Collections.Specialized enthält StringDictionary. Die Bemerkungen Abschnitt der MSDN heißt es: „Ein Schlüssel nicht null sein kann, aber ein Wert kann

Der Schlüssel in Groß- und Kleinschreibung Weise gehandhabt wird,. Es wird übersetzt in Kleinbuchstaben, bevor es mit dem String-Wörterbuch verwendet wird

.

In .NET Framework Version 1.0 verwendet diese Klasse kultursensitive Zeichenfolgenvergleiche.In .NET Framework Version 1.1 und höher verwendet diese Klasse jedoch CultureInfo.InvariantCulture beim Vergleichen von Zeichenfolgen.Weitere Informationen darüber, wie Kultur Vergleiche und Sortierungen beeinflusst, finden Sie unter Siehe Vergleichen und Sortieren von Daten für eine bestimmte Kultur und Durchführen von kulturunempfindlichen String-Operationen.

Verwandte Themen