2013-03-03 15 views
16

io spesso utilizzare questo codice per confrontare una stringa:uguaglianza String con la gestione nullo

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

Questo gestisce il caso nulla prima ecc

C'è un modo più pulito per fare confronto di stringhe, magari con una singola chiamata al metodo che gestirà possibili valori nulli? Voglio semplicemente sapere che le stringhe non sono uguali se il valore di test è nullo.

(sto avendo dejavu che forse ho chiesto questo prima, mi scuso se è così)


Aggiornamento: Nel mio caso, lo str2 è una buona stringa nota da confrontare, in modo da don 'necessario controllarlo per null. str1 è la stringa "sconosciuto", che può essere nullo, quindi voglio dire "str1 str2 non è uguale" nei casi in cui str1 è nulla ...

+1

Il tuo codice è errato; restituirà true se 'str1' è nullo e' str2' non lo è. – SLaks

+0

@SLaks In realtà, penso che sia quello che vuole. Almeno in base alla descrizione –

+0

ho un! lì dentro, quindi continuerà solo se la stringa da confrontare NON è nulla/vuota. Agli ordini? –

risposta

25

A differenza di Java, C# stringhe sostituiscono l'operatore ==:

if (str1 == str2) 

Se si desidera un case-insensitive confronto:

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

Lascerò all'OP, ma credo che l'obiettivo è anche fallire se entrambe le parti sono 'null' –

+1

@JustinPihony' str1 == str2 && str1! = Null' è ancora molto più elegante. –

+0

@ p.s.w.g E, va bene, ma questa risposta non lo dice. Inoltre, vedi la mia risposta per un modo per incapsulare questo ... come detto, la denominazione del metodo potrebbe essere più difficile –

12

Se fate non vuole trattare due null stringhe come uguali tra ot lei, il tuo codice è ottimale.

Se, d'altra parte, si vuole trattare null valori come uguali tra loro, è possibile utilizzare

object.Equals(str1, str2) 

per un approccio più "simmetrico" che gestisce anche null valori.

+1

ok, questo funzionerà davvero per me dato che str2 è un valore noto e non nullo. Quindi il confronto nullo non ha importanza. –

+0

Questa è una funzionalità utile da sapere. Tuttavia, non aiuta nel mio caso particolare, poiché un valore vuoto nel primo oggetto è nullo, mentre un valore vuoto nel secondo valore è una stringa vuota. Ma grazie! – CigarDoug

+0

@CigarDoug Con le stringhe C# non esiste qualcosa come "un valore vuoto" che è "null". Sfortunatamente, spesso hanno lo stesso aspetto, causando molta confusione. Puoi risolvere questo problema usando l'espressione 'object.Equals (str1 ??" ", str2 ??" ")'. – dasblinkenlight

2

È possibile utilizzare questo codice

object.Equals(str1, str2) 
3

Non c'è costruito in modo per fare questo, ma è possibile creare un metodo di estensione per incapsulare questo.

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

quindi utilizzare in questo modo:

str1.IsNotNullAndEquals(str2); 

Naming sta per essere la vostra cosa più difficile qui IMO ... in quanto è necessario per comunicare che si è solo nullo controllo str1. Se usato come metodo di estensione, legge abbastanza bene, ma se usato come statico regolare, non lo trasmette.

+0

Questo è quello che ho pensato sarebbe stato necessario. Era davvero più curioso se ci fosse qualcosa di incorporato che gestisse questo, ma sembrasse un "no". Grazie! –

+0

, in realtà, un metodo di estensione funziona con str1 se str1 è un null? Sto pensando che bombarderà con un'eccezione nulla –

+0

@boomhauer Innanzitutto, credo di sì, ma lo verificherò a breve. In secondo luogo, se funziona, un apprezzamento e accettazione sono apprezzati –

6

So che questo ha alcuni anni e penso che la soluzione di dasblinkenlight sia funzionalmente perfetta per quello che hai chiesto. Tuttavia preferisco questo codice per motivi di leggibilità:

String.Equals(str1, str2)