2009-03-10 7 views
131

Ich weiß, dass die folgende Groß- und Kleinschreibung:Gibt es einen Groß- und Kleinbuchstaben, bei dem der Groß-/Kleinschreibung gleich ist?

if (StringA == StringB) { 

es ist also ein Operator, der zwei Saiten in einer unempfindlichen Weise vergleicht?

+0

möglich Duplikat [Caselessly Strings in C# zu vergleichen] (http://stackoverflow.com/questions/501906/caseless-comaring-strings-in-c-sharp) – nawfal

+0

Falls jemand über diese Frage stolpert, die nach einem case insensitive Vergleich für ein Wörterbuch sucht, sehen Sie sich diese Frage an hier: [Groß-/Kleinschreibung nicht beachten für generisches Wörterbuch] (http://stackoverflow.com/questions/13230414/case-insensitive-access-for-generic-dic – Robotnik

+0

Es wäre wirklich nett; sagen wir, um eine entsprechende '~ =' zu definieren, um '==' als eine Groß-und Kleinschreibung Version. – eidylon

Antwort

240

Versuchen Sie folgendes:

string.Equals(a, b, StringComparison.CurrentCultureIgnoreCase); 
+0

Ich bin ein relativer StackOverflow-Neuling - kannst du erklären, was du meinst, indem du einen Link hinzufügst? Meinst du zu den MSDN-Dokumenten? –

+0

Gosh du bist schnell .. lol Ich tippte die Antwort Sie haben mich zuerst = D – Erick

+0

Sie können einen MSDN-Link hinzufügen (was ich normalerweise tun) oder wenn Sie interessante Blog-Posts oder solche finden, die vielleicht die Antwort erweitern. – Samuel

14
System.Collections.CaseInsensitiveComparer 

oder

System.StringComparer.OrdinalIgnoreCase 
+0

Wirkt sich dies auf die gesamte Anwendung aus? – GateKiller

+0

Nein, nur wenn Sie es verwenden. – leppie

+2

Wo finde ich weitere Informationen dazu? Bedeutet das, dass ich == für eine case-insensitive Übereinstimmung verwenden kann? – GateKiller

3

Operator? NEIN, aber ich denke, dass Sie Ihre Kultur ändern können, so dass String-Vergleich nicht zwischen Groß- und Kleinschreibung unterscheidet.

// you'll want to change this... 
System.Threading.Thread.CurrentThread.CurrentCulture 
// and you'll want to custimize this 
System.Globalization.CultureInfo.CompareInfo 

Ich bin zuversichtlich, dass es die Art ändern wird, wie Zeichenfolgen vom Gleichheitsoperator verglichen werden.

+4

Das ist ein bisschen ein hässlicher Hack imho ... –

+0

Ja, um es ganz zu sagen, es ist absolut nicht das, was Sie tun möchten, wenn Sie wollen, dass alle Zeichenfolgenvergleiche die Groß-/Kleinschreibung nicht beachten. Aber ich denke, es verändert das Verhalten des Gleichheitsoperators. –

9
string.Equals(StringA, StringB, StringComparison.CurrentCultureIgnoreCase); 
0
if (StringA.ToUpperInvariant() == StringB.ToUpperInvariant()) { 

Menschen berichten ToUpperInvariant() schneller als ToLowerInvariant().

+1

Invariant könnte eine schlechte Idee sein, wenn die aktuelle oder gewünschte Kultur spezielle Regeln für das Obergehäuse hat. – OregonGhost

+0

Und die Semantik ist auch anders. – leppie

+0

Erstellt dies eine neue Kopie jeder Zeichenfolge? Wenn ja, schlechte Idee. – cjk

3

können Sie

if (stringA.equals(StringB, StringComparison.CurrentCultureIgnoreCase)) 
7

oder

if (StringA.Equals(StringB, StringComparison.CurrentCultureIgnoreCase)) { 

aber Sie müssen sicher sein, verwenden, dass Stringa nicht null ist. So wahrscheinlich eine bessere Nutzung tu:

string.Equals(StringA , StringB, StringComparison.CurrentCultureIgnoreCase); 

wie John vorgeschlagen

EDIT: den Fehler korrigiert

0
string.Compare(string1, string2, true) 
+1

Dies kann I18N Probleme haben. –

16

Es gibt eine Reihe von Eigenschaften auf der StringComparer statische Klasse, die comparers für jede Art Rückkehr von Groß- und Klein möchten Sie vielleicht:

StringComparer Properties

Zum Beispiel können Sie

StringComparer.CurrentCultureIgnoreCase.Equals(string1, string2) 

oder

StringComparer.CurrentCultureIgnoreCase.Compare(string1, string2) 

Es ist ein bisschen sauberer als die string.Equals oder string.Compare Überlastungen nennen, die ein StringComparison Argument.

2

Ich bin so zu Typisierung am Ende dieser Vergleichsmethoden verwendet: , StringComparison.

Also machte ich eine Verlängerung.

namespace System 
{ public static class StringExtension 
    { 
     public static bool Equals(this string thisString, string compareString, 
      StringComparison stringComparison) 
     { 
      return string.Equals(thisString, compareString, stringComparison); 
     } 
    } 
} 

Nur beachten Sie, dass Sie für null auf thisString vor dem Aufruf der ext müssen überprüfen.

18

Der beste Weg 2 Strings zu vergleichen, ohne den Fall der Buchstaben zu beachten, ist die Verwendung der statischen Methode String.Equals, die einen ordinalen Stringvergleich zum Ignorieren angibt. Dies ist auch der schnellste Weg, viel schneller, als die Strings in Klein- oder Großbuchstaben umzuwandeln und sie danach zu vergleichen.

Ich testete die Leistung beider Ansätze und die ordinale ignorieren Fall Zeichenfolge Vergleich war mehr als 9 mal schneller! Es ist auch zuverlässiger als das Konvertieren von Zeichenfolgen in Klein- oder Großbuchstaben (überprüfen Sie das türkische i-Problem). Also immer die String.Equals Methode Strings auf Gleichheit vergleichen:

String.Equals(string1, string2, StringComparison.OrdinalIgnoreCase); 

Wenn Sie einen kulturspezifische String-Vergleich durchführen möchten Sie den folgenden Code verwenden:

String.Equals(string1, string2, StringComparison.CurrentCultureIgnoreCase); 

Bitte beachten Sie, dass die zweiten Verwendungsbeispiele die Zeichenfolgenvergleichslogik der aktuellen Kultur, wodurch sie im ersten Beispiel langsamer ist als der Vergleich "Ordnungszahl ignorieren". Wenn Sie also keine kulturspezifische Zeichenfolgenvergleichslogik benötigen und die maximale Leistung erreicht haben, verwenden Sie die " ordinal ignore case "Vergleich.

Für weitere Informationen, read the full story on my blog.

+0

Schlagen Sie nicht "ToLower" oder "ToLowerInvariant" vor: Sie erstellen Speicher, nur um einen Vergleich durchzuführen, und sie können fehlschlagen, wenn neue Zeichensätze zu Unicode hinzugefügt werden. 'ToUpper' scheitert ua an dem türkischen 'i'; Es gibt keinen Grund, warum 'ToLower' in Zukunft aus ähnlichen Gründen nicht ausfallen wird. – antiduh

+0

@antiduh, danke für deinen Kommentar. Die meisten von uns sind sich dieser potenziellen Probleme bewusst, viele Tutorials über das Internet geben das türkische "i" als Beispiel. Wie Sie in meinem Beitrag sehen, rate ich nicht zu 'ToLower' oder' ToLowerInvariant' Methoden, ich wollte nur zeigen, wie viel effizienter die 'String.Equals' Methode ist. –

+3

"Die meisten von uns sind sich dieser potenziellen Probleme bewusst, viele Tutorials über das Internet geben das türkische 'ich' als Beispiel" - nicht genug Leute, und Sie erwähnen es immer noch als zweiten Satz in Ihrer Antwort. Darüber hinaus enthält Ihre * Antwort * keine ausreichende Begründung, um sie niemals zu verwenden - Sie erwähnen lediglich die Leistung; Leistung ist nicht immer die höchste Priorität. Aus diesem Grund verstoßen Sie derzeit gegen die Richtlinien der Hilfe. Links zu externen Websites sind in Ordnung, aber Sie haben den Inhalt nicht ausreichend zusammengefasst (türkisches "i" -Problem). SO ist nicht Ihre Werbeplattform. – antiduh

0

Andere Antworten sind hier absolut gültig, aber irgendwie dauert es einige Zeit, um StringComparison.OrdinalIgnoreCase und auch String.Compare einzugeben.

Ich habe einfache String-Extension-Methode codiert, in dem Sie festlegen können, wenn Vergleich Groß- und Kleinschreibung oder Fall sinnlos mit boolean ist - siehe folgende Antwort:

https://stackoverflow.com/a/49208128/2338477

Verwandte Themen