Najkrótszy sposób sprawdzenia wartości null i przypisania innej wartości, jeśli nie

86

Wyciągam varcharwartości z bazy danych i chcę ustawić, do stringktórego przypisuję je jako „”, jeśli są null. Obecnie robię to w ten sposób:

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

Wygląda na to, że powinien być sposób, aby to zrobić w jednej linii, na przykład:

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

Jednak nie mogę znaleźć optymalnego sposobu, aby to zrobić. Czy jest lepszy sposób, czy też mam najlepszy sposób, aby to zrobić?

Splashlin
źródło
5
== true jest tutaj zbędne ...
cjk,

Odpowiedzi:

104

Spróbuj tego:

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

Możesz również użyć operatora łączącego wartości null, jak powiedzieli inni - ponieważ nikt nie podał przykładu, który działa z twoim kodem, tutaj jest jeden:

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

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

Andrew Hare
źródło
8
Czy ten operator koalescencji zerowej i tak nie zgłasza odwołania zerowego? Ja widzę ten kod wykonuje następujące operacje: if (planRec.approved_by == null) { this.approved_by = planRec.approved_by.toString(); //<= nullref } else { this.approved_by = planRec.approved_by;}. Jeśli się mylę, proszę wskazać błąd.
Destrictor
10
@Destrictor ma rację, kod jest uszkodzony. Oto poprawka z użyciem innego zabawnego operatora: this.approved_by = planRec.approved_by?.toString() ?? ""; <- To jest operator warunkowy zerowy i nie sądzę, że był w pobliżu, kiedy po raz pierwszy zadano to pytanie i udzielono odpowiedzi. Miejmy nadzieję, że OP to zobaczy, więc może przejść do refaktoryzacji swojego 7-letniego kodu sprzed dwóch prac :).
Patrick,
34

Operator COALESCE (??) jest to, co chcesz, ja wierzę.

Dave Ward
źródło
4
Tak ... ale tylko dlatego, że wartość domyślna to „”.
Paul Alexander
Jak to? Można użyć dowolnego wyrażenia, aby zamienić null na ..
TaW
30

Szukasz operatora koalescencji C #: ??. Ten operator przyjmuje lewy i prawy argument. Jeśli lewa strona operatora ma wartość null lub dopuszcza wartość null bez wartości, zwróci prawy argument. W przeciwnym razie zwróci lewą stronę.

var x = somePossiblyNullValue ?? valueIfNull;
JaredPar
źródło
Ta odpowiedź nie obejmuje wszystkich przypadków z pytania (tylko częściowo). Zauważ, że istnieje „string.IsNullOrEmpty”. Więc pusty przypadek nie jest tutaj obsługiwany.
Bronek
28

Domyślam się, że najlepsze, co możesz wymyślić, to

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

Oczywiście, ponieważ sugerujesz, że approved_byjest to object(które nie może równać się „”), zostanie to przepisane jako

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();
Dmitri Nesteruk
źródło
20

W C # 6 istnieje nieco krótsza droga dla przypadku, gdy planRec.approved_by nie jest ciągiem:

this.approved_by = planRec.approved_by?.ToString() ?? "";
Malcolm
źródło
15

Użyj operatora łączenia C #: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;
Ramgy Borja
źródło
15

Począwszy od języka C # 8,0, można użyć operatora ?? =, aby zamienić kod formularza

if (variable is null)
{
    variable = expression;
}

z następującym kodem:

variable ??= expression;

Więcej informacji tutaj

nzrytmn
źródło
9

Aby rozszerzyć odpowiedź @ Dave ... jeśli planRec.approved_by jest już ciągiem znaków

this.approved_by = planRec.approved_by ?? "";
Paul Alexander
źródło
2

Aby przypisać niepustą zmienną bez powtarzania rzeczywistej nazwy zmiennej (i bez przypisywania czegokolwiek, jeśli zmienna ma wartość null!), Możesz użyć małej metody pomocniczej z Actionparametrem:

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

A potem po prostu użyj:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);
Jack Miller
źródło
1

Możesz to również zrobić w swoim zapytaniu, na przykład w serwerze sql, Google ISNULLi CASEfunkcjach wbudowanych.

user133371
źródło
-4

Używam metody rozszerzania SelfChk

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

Następnie użyj like

string a = null;
"A".SC(ref a);
Ali Humayun
źródło
Myślę, że masz na myśli, ale niełatwe do odczytania i zrozumienia, prawda?
Ali Humayun
3
UPS! Masz całkowitą rację: bardzo krótki, ale NIEłatwy do odczytania i zrozumienia (przynajmniej jeśli nie jesteś przyzwyczajony do tego zapisu)
Jack Miller
w takim razie spróbuj przeczytać książkę. Wydawałoby się, że jest to naprawdę obszerne i łatwe do zrozumienia: p
Ali Humayun