2009-07-13 9 views
37

Wyciągam wartości varchar z bazy danych i chcę ustawić ciąg, który przypisuję je jako "", jeśli są one zerowe. Obecnie robię to w ten sposób.Najkrótszy sposób na sprawdzenie wartości Null i przypisanie innej wartości, jeśli nie

if (IsNullOrEmpty(planRec.approved_by) == true) 
    this.approved_by = ""; 
else 
    this.approved_by = planRec.approved_by.toString(); 

Wygląda jak nie powinno być jakiś sposób, aby to zrobić w jednym wierszu coś jak

this.approved_by = "" || planRec.approved_by.toString(); 

Jednak nie mogę znaleźć optymalny sposób to zrobić. Czy istnieje lepszy sposób, czy też mam najlepszy sposób na zrobienie tego?

+3

== true jest zbędny ... – cjk

+3

tu na kompletnym marginesie, Sugerowałbym, że "== true" nie dodaje nic do kodu. Poza tym, że w rzeczywistości nie są potrzebne, uważam, że bezpośrednie porównania z literałami boolowskimi są niezręczne. –

+9

@ ck & Steven: Można argumentować, czy coś dodaje. Osobiście dodaję "== false" i "== true" do każdego porównania, aby zapobiec wypadkom. Łatwo jest pominąć "!" lub wydaje ci się, że ją widziałeś. Można łatwo argumentować, że zwiększa przejrzystość i czytelność. –

Odpowiedz

56

Spróbuj tego:

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? "" : planRec.approved_by.toString(); 

Można również użyć operatora null koalescencyjny jako drugi powiedział - ponieważ nikt nie dał przykład, który działa z kodem Oto jeden:

this.approved_by = planRec.approved_by ?? planRec.approved_by.toString(); 

Ale ten przykład działa tylko dlatego, że możliwa wartość dla this.approved_by jest taka sama jak jedna z potencjalnych wartości, które chcesz ustawić. We wszystkich innych przypadkach będziesz musiał użyć operatora warunkowego, jak pokazano w moim pierwszym przykładzie.

+2

Nawiasem mówiąc, jest to nazywane operatorem koalescencyjnym zerowym. – Powerlord

+0

Najpierw zaksięgowałem operatora koalescencji zerowej, ale uważam, że operator warunkowy lepiej pasuje do tego, o co prosi OP. –

+0

@R. Bemrose ... operator koalescencji zerowej to ... zobacz odpowiedź @ Dave'a poniżej. –

16

Uważam, że coalesce operator (??) jest tym, czego chcesz.

+3

Tak ... ale tylko dlatego, że wartością domyślną jest "". –

11

Szukasz operatora koalescencji C#: ??. Ten operator przyjmuje lewy i prawy argument. Jeśli lewa strona operatora jest pusta lub nie ma wartości zerowej, zwróci właściwy argument. W przeciwnym razie zwróci lewą.

var x = somePossiblyNullValue ?? valueIfNull; 
+0

Ups, trochę się spóźniłem. Dobra odpowiedź. – Yohnny

+2

To nie będzie działać dla mojej aplikacji, ponieważ .ToString będzie generował błąd – Splashlin

18

Domyślam się najlepiej można wymyślić jest

this.approved_by = IsNullOrEmpty(planRec.approved_by) ? string.Empty 
                 : planRec.approved_by.ToString(); 

Oczywiście skoro jesteś sugerując przy tym, że approved_by stanowi object (która nie może się równać „”), to będzie być zapisane jako

this.approved_by = (planRec.approved_by ?? string.Empty).ToString(); 
+3

+1 dla najbardziej kompletnej odpowiedzi. Gdybym mógł dać kolejny +1 za użycie string.Empty, zrobiłbym. –

+0

Zgadzam się ze Stevenem Podobał mi się string Dmitris.Empty. Ale lubię to odwrócić. Najpopularniejszy i najbardziej naturalny najpierw: this.approved_by = planRec.approved_by! = Null? planRec.approved_by.ToString(): string.Empty; –

7

Aby przedłużyć @Dave's answer ... jeśli planRec.approved_by jest już ciąg

this.approved_by = planRec.approved_by ?? ""; 
1

Można to również wykonać w zapytaniu, na przykład w serwerze sql, google ISNULL i CASE funkcji wbudowanych.

-2

używam metody EXTENTION SelfChk

static class MyExt { 
//Self Check 
public static void SC(this string you,ref string me) 
    { 
     me = me ?? you; 
    } 
} 

Następnie użyj jak

string a = null; 
"A".SC(ref a); 
+0

Bardzo krótki, ale łatwy do odczytania i zrozumienia. –

+0

Sądzę, że masz na myśli, ale nie jest to łatwe do odczytania i zrozumienia, czy tak jest? –

+1

UPS! Masz absolutną rację: bardzo krótko, ale NIE jest to łatwe do odczytania i zrozumienia (przynajmniej jeśli nie jesteś przyzwyczajony do tej notacji) –

5

z C# 6 nie jest nieznacznie krótsza droga do przypadku, w którym planRec.approved_by nie jest ciągiem:

this.approved_by = planRec.approved_by?.ToString() ?? ""; 
3

Użyj operatora koalescencji C#: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue 
var newValue = Value ?? YournullValue; 
1

Aby przypisać zmienną niepusty bez powtarzania rzeczywistą nazwę zmiennej (i bez przypisywania nic, jeśli zmienna jest zerowy!), Można użyć trochę metody pomocnika z parametrem Action:

public static void CallIfNonEmpty(string value, Action<string> action) 
{ 
    if (!string.IsNullOrEmpty(value)) 
     action(value); 
} 

a potem po prostu go używać:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s); 
Powiązane problemy