Der Vergleich von Zeichenfolgen in C # ist ziemlich einfach. In der Tat gibt es mehrere Möglichkeiten, dies zu tun. Ich habe einige im Block unten aufgelistet. Worauf ich neugierig bin, sind die Unterschiede zwischen ihnen und wann einer über den anderen verwendet werden sollte? Sollte man um jeden Preis vermieden werden? Gibt es noch mehr, die ich nicht aufgelistet habe?
string testString = "Test";
string anotherString = "Another";
if (testString.CompareTo(anotherString) == 0) {}
if (testString.Equals(anotherString)) {}
if (testString == anotherString) {}
(Hinweis: Ich suche in diesem Beispiel nach Gleichheit, nicht kleiner oder größer als, aber ich kann dies auch gerne kommentieren.)
c#
string
comparison
Craig
quelle
quelle
Antworten:
Hier sind die Regeln für die Funktionsweise dieser Funktionen:
stringValue.CompareTo(otherStringValue)
null
kommt vor einer SchnurCultureInfo.CurrentCulture.CompareInfo.Compare
, was bedeutet, dass es einen kulturabhängigen Vergleich verwendet. Dies könnte bedeuten, dassß
vergleichbar mitSS
in Deutschland oder ähnlichstringValue.Equals(otherStringValue)
null
wird als gleichwertig angesehenStringComparison
Option angeben , wird eine direkte ordinale Gleichheitsprüfung verwendet , die in keiner Sprache oder Kulturß
identischSS
iststringValue == otherStringValue
stringValue.Equals()
.==
Operator ruft die statischeEquals(string a, string b)
Methode auf (die wiederum an eine interne Methode gehtEqualsHelper
, um den Vergleich durchzuführen..Equals()
einernull
Zeichenfolge führt zu einernull
Referenzausnahme, während dies bei on==
nicht der Fall ist.Object.ReferenceEquals(stringValue, otherStringValue)
Überprüft nur, ob Referenzen gleich sind, dh es sind nicht nur zwei Zeichenfolgen mit demselben Inhalt, sondern Sie vergleichen ein Zeichenfolgenobjekt mit sich selbst.
Beachten Sie, dass es bei den oben genannten Optionen, die Methodenaufrufe verwenden, Überladungen mit mehr Optionen gibt, mit denen angegeben werden kann, wie verglichen werden soll.
Mein Rat, wenn Sie nur auf Gleichheit prüfen möchten, ist, sich zu entscheiden, ob Sie einen kulturabhängigen Vergleich verwenden möchten oder nicht, und dann
.CompareTo
oder.Equals
, je nach Wahl, zu verwenden.quelle
String.Compare
?Von MSDN:
Sie schlagen vor,
.Equals
statt.CompareTo
nur nach Gleichheit zu suchen. Ich bin mir nicht sicher, ob es einen Unterschied zwischen.Equals
und==
für diestring
Klasse gibt. Ich werde manchmal.Equals
oderObject.ReferenceEquals
anstelle von==
für meine eigenen Klassen verwenden, falls jemand zu einem späteren Zeitpunkt vorbeikommt und den==
Operator für diese Klasse neu definiert .quelle
Wenn Sie jemals neugierig auf Unterschiede in den BCL-Methoden sind, ist Reflector Ihr Freund :-)
Ich folge diesen Richtlinien:
Genaue Übereinstimmung: BEARBEITEN: Ich habe zuvor immer den Operator == verwendet, nach dem Prinzip, dass innerhalb von Equals (Zeichenfolge, Zeichenfolge) der Operator object == verwendet wird, um die Objektreferenzen zu vergleichen, aber es scheint, dass strA.Equals (strB) immer noch 1-11% beträgt Insgesamt schneller als string.Equals (strA, strB), strA == strB und string.CompareOrdinal (strA, strB). Ich habe eine Schleife mit einer StopWatch sowohl für internierte als auch für nicht internierte Zeichenfolgenwerte mit gleichen / unterschiedlichen Zeichenfolgenlängen und unterschiedlichen Größen (1B bis 5 MB) getestet.
Vom Menschen lesbare Übereinstimmung (westliche Kulturen, ohne Berücksichtigung der Groß- und Kleinschreibung):
Vom Menschen lesbare Übereinstimmung (Alle anderen Kulturen, unempfindlicher Fall / Akzent / Kana / usw., definiert von CultureInfo):
Vom Menschen lesbare Übereinstimmung mit benutzerdefinierten Regeln (alle anderen Kulturen):
quelle
Wie Ed sagte, wird CompareTo zum Sortieren verwendet.
Es gibt jedoch einen Unterschied zwischen .Equals und ==.
== löst im Wesentlichen den folgenden Code auf:
Der einfache Grund ist, dass Folgendes eine Ausnahme auslöst:
Und das wird nicht:
quelle
Gute Erklärungen und Vorgehensweisen zu Problemen beim Vergleichen von Zeichenfolgen finden Sie im Artikel Neue Empfehlungen für die Verwendung von Zeichenfolgen in Microsoft .NET 2.0 sowie in den Best Practices für die Verwendung von Zeichenfolgen in .NET Framework .
Jede der genannten Methoden (und andere) hat einen bestimmten Zweck. Der Hauptunterschied zwischen ihnen besteht darin, welche Art von StringComparison-Aufzählung sie standardmäßig verwenden. Es gibt mehrere Möglichkeiten:
Jeder der oben genannten Vergleichstypen zielt auf unterschiedliche Anwendungsfälle ab:
Beachten Sie, dass die StringComparison-Aufzählung sowie Überladungen für Zeichenfolgenvergleichsmethoden seit .NET 2.0 vorhanden sind.
String.CompareTo-Methode (String)
Ist in der Tat typsichere Implementierung der IComparable.CompareTo-Methode . Standardinterpretation: CurrentCulture.
Verwendungszweck:
So
String.Compare-Methode
Ein statisches Mitglied der String-Klasse mit vielen Überladungen. Standardinterpretation: CurrentCulture.
String.Equals-Methode
Überschreiben von Objektklasse und aus Gründen der Typensicherheit überladen. Standardinterpretation: Ordnungszahl. Beachte das:
StringComparer-Klasse
Es gibt auch eine andere Möglichkeit, mit Zeichenfolgenvergleichen umzugehen, die insbesondere auf das Sortieren abzielt:
quelle
Nicht, dass die Leistung in 99% der Fälle von Bedeutung ist, aber wenn Sie dies mehrere Millionen Mal in einer Schleife tun müssten, würde ich Ihnen dringend empfehlen, .Equals oder == zu verwenden, da sobald ein Charakter gefunden wird das stimmt nicht überein, wirft das Ganze als falsch heraus, aber wenn Sie CompareTo verwenden, muss es herausfinden, welcher Charakter kleiner als der andere ist, was zu einer etwas schlechteren Aufführungszeit führt.
Wenn Ihre App in verschiedenen Ländern ausgeführt wird, empfehlen wir Ihnen, sich die Auswirkungen von CultureInfo anzusehen und möglicherweise .Equals zu verwenden. Da ich nur Apps für die USA schreibe (und es mir egal ist, ob es von jemandem nicht richtig funktioniert), verwende ich immer nur ==.
quelle
In den hier aufgeführten Formularen gibt es keinen großen Unterschied zwischen den beiden.
CompareTo
Am Ende wird eineCompareInfo
Methode aufgerufen, die einen Vergleich unter Verwendung der aktuellen Kultur durchführt.Equals
wird vom==
Operator aufgerufen .Wenn Sie Überlastungen berücksichtigen, werden die Dinge anders.
Compare
und==
kann nur die aktuelle Kultur verwenden, um eine Zeichenfolge zu vergleichen.Equals
undString.Compare
kann einStringComparison
Aufzählungsargument verwenden, mit dem Sie kulturunabhängige oder fallunabhängige Vergleiche angeben können. Sie können nurString.Compare
eine angebenCultureInfo
und Vergleiche mit einer anderen Kultur als der Standardkultur durchführen.Aufgrund seiner Vielseitigkeit verwende ich
String.Compare
mehr als jede andere Vergleichsmethode. Damit kann ich genau angeben, was ich will.quelle
Ein großer Unterschied ist .Equals () löst eine Ausnahme aus, wenn die erste Zeichenfolge null ist, während == dies nicht tut.
quelle
quelle
Die Verwendung von .Equals ist auch viel einfacher zu lesen .
quelle
Mit .Equals erhalten Sie auch die StringComparison-Optionen. Sehr praktisch, um Koffer und andere Dinge zu ignorieren.
Übrigens wird dies als falsch ausgewertet
Da == die Werte von a und b (die Zeiger sind) vergleicht, wird dies nur dann als wahr ausgewertet, wenn die Zeiger auf dasselbe Objekt im Speicher zeigen. Gleichungen dereferenzieren die Zeiger und vergleichen die an den Zeigern gespeicherten Werte. a.Gleichungen (b) wären hier wahr.
und wenn Sie b ändern zu:
dann ist a.Equals (b) falsch, aber
wäre wahr
a.CompareTo (b) ruft die CompareTo-Funktion des Strings auf, die die Werte an den Zeigern vergleicht und <0 zurückgibt, wenn der bei a gespeicherte Wert kleiner als der bei b gespeicherte Wert ist, und 0 zurückgibt, wenn a.Equals (b) true ist, und > 0 sonst. Dies unterscheidet jedoch zwischen Groß- und Kleinschreibung. Ich denke, es gibt möglicherweise Optionen für CompareTo, um Groß- und Kleinschreibung und dergleichen zu ignorieren, aber Sie haben jetzt keine Zeit, nachzuschauen. Wie andere bereits angegeben haben, würde dies zum Sortieren erfolgen. Ein Vergleich der Gleichheit auf diese Weise würde zu unnötigem Overhead führen.
Ich bin mir sicher, dass ich Dinge weglasse, aber ich denke, dies sollten genug Informationen sein, um mit dem Experimentieren zu beginnen, wenn Sie weitere Details benötigen.
quelle