2013-03-03 26 views
16

będę często korzystać z tego kodu, aby porównać ciąg:równość String z obsługą zerowej

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

ten obsługuje zerowej przypadek pierwszy itd

istnieje przejrzysty sposób zrobić porównania ciągów, być może z jedno wywołanie metody, które obsłuży możliwe wartości null? Po prostu chcę wiedzieć, że łańcuchy nie są równe, jeśli wartość testowania jest zerowa.

(mam dejavu że mogę prosić to wcześniej, ja przepraszam, jeśli tak)


Update: W moim przypadku, słowo2 Znany jest dobry ciąg do porównania, więc don należy sprawdzić to za null. str1 jest „nieznany” łańcuch, który może być zerowy, więc chcę powiedzieć „str1 nie równa STR2” W przypadkach, w których str1 jest zerowa ...

+1

Twój kod jest błędny; Zwróci true, jeśli "str1" ma wartość null, a "str2" nie. – SLaks

+0

@SLaks Właściwie to myślę, że tego właśnie chce. Przynajmniej na podstawie opisu –

+0

Mam! tam, więc będzie kontynuowany tylko wtedy, gdy ciąg do porównania będzie NIE był pusty/pusty. righto? –

Odpowiedz

25

przeciwieństwie do Javy, C# ciągi przesłonić operatora ==:

if (str1 == str2) 

Jeśli chcesz bez uwzględniania wielkości liter porównania:

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

Zostawię to do OP, ale uważam, że celem jest również nie udać się, jeśli którejkolwiek ze stron jest 'null' –

+1

@JustinPihony' str1 == str2 && str1! = Null' jest jeszcze bardziej elegancka. –

+0

@ p.s. g. To dobrze, ale ta odpowiedź tego nie mówi. Zobacz także moją odpowiedź na sposób hermetyzacji tego ... jak stwierdzono, nazewnictwo metody może być najtrudniejsze –

12

Jeśli nie nie chcą leczyć dwa null sznurki jak równe sobie ot jej, twój kod jest optymalny.

Jeśli, z drugiej strony, chcesz się leczyć null wartości jak równe sobie, można użyć

object.Equals(str1, str2) 

do podejścia bardziej „symetrycznej”, który również obsługuje null wartości.

+1

ok, to faktycznie będzie działać dla mnie, ponieważ str2 jest znaną wartością, a nie zerową. Zatem zerowe porównanie nie będzie miało znaczenia. –

+0

Jest to przydatna funkcja, którą należy znać. Jednak w moim przypadku nie pomaga, ponieważ pusta wartość w pierwszym obiekcie jest pusta, podczas gdy pusta wartość w drugiej wartości jest pustym ciągiem. Ale dzięki! – CigarDoug

+0

@CigarDoug Z ciągami C# nie ma czegoś takiego jak "pusta wartość", która jest "zerowa". Niestety często wyglądają tak samo, powodując wiele zamieszania. Możesz to naprawić, używając 'object.Equals (str1 ??" ", str2 ??" ")' expression. – dasblinkenlight

2

Można użyć tego kodu

object.Equals(str1, str2) 
3

Nie ma zbudowany w sposób to zrobić, ale można utworzyć metodę rozszerzenia do hermetyzacji to.

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

następnie używać go tak:

str1.IsNotNullAndEquals(str2); 

Naming będzie Twój Najtrudniej tutaj IMO ... ponieważ trzeba przekazać, że jesteś tylko zerowy sprawdzanie str1. Kiedy jest używana jako metoda rozszerzająca, czyta dość dobrze, ale jeśli jest używana jako zwykła statyczna, to również jej nie przekazuje.

+0

Oto, co według mnie byłoby potrzebne. Był naprawdę bardziej ciekawy, czy jest coś wbudowanego, który poradzi sobie z tym, ale wygląda jak "nie". Dzięki! –

+0

właściwie, czy metoda rozszerzenia działa dla str1, jeśli str1 ma wartość null? Myślę, że będzie bombardować z wyjątkiem zerowym –

+0

@boomhauer Po pierwsze, wierzę, że tak, ale wkrótce zweryfikuję. Po drugie, jeśli to działa, doceniamy upto i akceptujemy: –

6

Wiem, że to ma kilka lat i myślę, że rozwiązanie z dasblinkenlight jest funkcjonalnie idealne do tego, o co prosiłeś. Jednak preferuję ten kod z powodów czytelności:

String.Equals(str1, str2)