2013-03-03 8 views
16

Ich werde oft diesen Code verwenden, um eine Zeichenfolge zu vergleichen:String Gleichheit mit null Handhabung

if(!string.IsNullOrEmpty(str1) && str1.Equals(str2)){ 
    //they are equal, do my thing 
} 

Diese übernimmt den Null Fall zuerst usw.

Gibt es einen sauberen Weg String-Vergleich zu tun, vielleicht mit ein einzelner Methodenaufruf, der mögliche Nullwerte behandelt? Ich möchte nur wissen, dass die Zeichenfolgen nicht gleich sind, wenn der Testwert null ist.

(Ich habe dejavu, dass ich das schon gefragt haben mag, ich entschuldige mich, wenn so)


Update: In meinem Fall die str2 eine bekannte gute Saite ist zu vergleichen, so dass ich don Ich muss es nicht auf Null prüfen. str1 ist die "unbekannten" Zeichenfolge, die null sein kann, so möchte ich sagen, "str1 gleich str2 nicht" in den Fällen, in denen str1 null ist ...

+1

Ihr Code ist falsch; es wird wahr zurückgegeben, wenn "str1" null und "str2" nicht ist. – SLaks

+0

@SLaks Eigentlich denke ich das ist was er will. Zumindest basierend auf der Beschreibung –

+0

habe ich eine! da drin, so wird es nur weitergehen, wenn die zu vergleichende Zeichenkette NICHT null/leer ist. Richtig? –

Antwort

25

Im Gegensatz zu Java, # Strings C die == Operator überschreiben:

if (str1 == str2) 

Wenn Sie ein Groß- und Kleinschreibung Vergleich wollen:

if (String.Equals(str1, str2, StringComparison.OrdinalIgnoreCase) 
+0

Ich werde es dem OP überlassen, aber ich glaube, dass das Ziel ist auch fehlschlagen, wenn beide Seite ist 'null' –

+1

@JustinPihony 'str1 == str2 && str1! = Null' ist immer noch viel eleganter. –

+0

@ p.s.w.g Und das ist in Ordnung, aber diese Antwort sagt das nicht. Siehe auch meine Antwort für eine Möglichkeit, dies einzukapseln ... wie gesagt, die Namensgebung der Methode könnte am schwierigsten sein –

12

Wenn Sie das tun nicht wollen behandeln zwei null Strings als gleich jeder ot Ihr Code ist optimal.

Wenn auf der anderen Seite wollen Sie null Werte sich gleich zu behandeln, können Sie

object.Equals(str1, str2) 

für einen „symmetrischen“ Ansatz verwenden, der auch null Werte behandelt.

+1

ok, das wird für mich funktionieren, da str2 ein bekannter Wert und nicht null ist. Daher wird der Null-Vergleich keine Rolle spielen. –

+0

Dies ist nützliche Funktionalität zu wissen. Es hilft jedoch in meinem speziellen Fall nicht, da ein leerer Wert im ersten Objekt null ist, während ein leerer Wert im zweiten Wert eine leere Zeichenfolge ist. Aber danke! – CigarDoug

+0

@CigarDoug Bei C# -Zeichenfolgen gibt es keinen "leeren Wert", der "null" ist. Leider sehen sie oft gleich aus und verursachen viel Verwirrung. Sie können dies beheben, indem Sie den Ausdruck "object.Equals (str1 ??" ", str2 ??" ")" verwenden. – dasblinkenlight

2

können Sie diesen Code verwenden

object.Equals(str1, str2) 
3

Es gibt keine in Art und Weise aufgebaut ist, dies zu tun, aber man konnte eine Verlängerung Methode erstellen diese verkapseln.

public static StringExtensions 
{ 
    public static Boolean IsNotNullAndEquals(this string str1, string str2) 
    { 
     return !string.IsNullOrEmpty(str1) && str1.Equals(str2) 
    } 
} 

dann wie folgt verwenden:

str1.IsNotNullAndEquals(str2); 

Naming wird hier IMO Ihre härteste Sache sein ... da Sie, dass Sie nur den Wert null Kontrolle str1 müssen vermitteln. Wenn es als eine Erweiterungsmethode verwendet wird, liest es ziemlich gut, aber wenn es als eine reguläre statische verwendet wird, dann wird es das auch nicht übertragen.

+0

Dies ist, was ich dachte, würde benötigt werden. War wirklich neugieriger, wenn da etwas eingebaut ist, das damit umgehen würde, aber wie ein "Nein" aussieht. Vielen Dank! –

+0

tatsächlich, würde eine Erweiterungsmethode für str1 funktionieren, wenn str1 eine Null ist? Ich denke, es wird mit einer Null-Ausnahme bombardieren –

+0

@boomhauer Zuerst glaube ich, aber wird in Kürze bestätigen. Zweitens, wenn das klappt, wird ein Upvote und Akzeptieren geschätzt –

6

Ich weiß, das ist einige Jahre alt und ich denke, die Lösung von dasblinkenlight ist funktional perfekt für das, was Sie gefragt haben. Allerdings bevorzuge ich diesen Code aus Gründen der Lesbarkeit:

String.Equals(str1, str2)