Der kürzeste Weg, um nach Null zu suchen und einen anderen Wert zuzuweisen, wenn nicht

80

Ich ziehe varcharWerte aus einer Datenbank und möchte die, denen stringich sie zuweise, als "" festlegen, wenn dies der Fall ist null. Ich mache es gerade so:

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

Es scheint eine Möglichkeit zu geben, dies in einer einzigen Zeile zu tun, etwa:

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

Ich kann jedoch keinen optimalen Weg finden, dies zu tun. Gibt es einen besseren Weg oder habe ich den besten Weg, dies zu tun?

Splashlin
quelle
5
Das == true ist hier überflüssig ...
cjk

Antworten:

101

Versuche dies:

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

Sie können auch den Null-Koaleszenz-Operator verwenden, wie andere gesagt haben - da hier niemand ein Beispiel angegeben hat, das mit Ihrem Code funktioniert, ist eines:

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

Dieses Beispiel funktioniert jedoch nur, da ein möglicher Wert für this.approved_bymit einem der potenziellen Werte identisch ist, auf die Sie ihn festlegen möchten. In allen anderen Fällen müssen Sie den bedingten Operator verwenden, wie ich in meinem ersten Beispiel gezeigt habe.

Andrew Hare
quelle
8
Wirft dieser Null-Koaleszenzoperator nicht trotzdem eine Nullreferenz? Ich sehe diesen Code folgendermaßen : if (planRec.approved_by == null) { this.approved_by = planRec.approved_by.toString(); //<= nullref } else { this.approved_by = planRec.approved_by;}. Wenn ich falsch liege, weisen Sie bitte auf den Fehler hin.
Destrictor
10
@Destrictor ist richtig, der Code ist kaputt. Hier ist ein Fix mit einem anderen Spaßoperator: this.approved_by = planRec.approved_by?.toString() ?? ""; <- Das ist der nullbedingte Operator, und ich glaube nicht, dass es ihn gab, als diese Frage zum ersten Mal gestellt und beantwortet wurde. Hoffentlich sieht OP das, damit er seinen 7 Jahre alten Code von vor zwei Jobs überarbeiten kann :).
Patrick
34

Der Koaleszenzoperator (??) ist genau das, was Sie wollen, glaube ich.

Dave Ward
quelle
4
Ja ... aber nur, weil der Standard "" ist.
Paul Alexander
Ähm, wie so? Man kann jeden Ausdruck verwenden, um null durch .. zu ersetzen.
TaW
30

Sie suchen den C # -Koaleszenzoperator: ??. Dieser Operator verwendet ein linkes und ein rechtes Argument. Wenn die linke Seite des Operators null oder nullbar ohne Wert ist, wird das rechte Argument zurückgegeben. Andernfalls wird die linke Seite zurückgegeben.

var x = somePossiblyNullValue ?? valueIfNull;
JaredPar
quelle
Diese Antwort deckt nicht alle Fälle aus der Frage ab (nur teilweise). Beachten Sie, dass es "string.IsNullOrEmpty" gibt. Der leere Fall wird hier also nicht behandelt.
Bronek
28

Ich vermute, das Beste, was Sie sich einfallen lassen können, ist

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

Da Sie auf die Tatsache hinweisen, dass approved_byes sich um eine handelt object(die nicht gleich "" sein kann), wird dies natürlich als neu geschrieben

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();
Dmitri Nesteruk
quelle
19

Mit C # 6 gibt es einen etwas kürzeren Weg für den Fall, dass planRec.approved_by keine Zeichenfolge ist:

this.approved_by = planRec.approved_by?.ToString() ?? "";
Malcolm
quelle
14

Verwenden Sie den C # -Koaleszenzoperator: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;
Ramgy Borja
quelle
13

Ab C # 8.0 können Sie den Code des Formulars mit dem Operator ?? = ersetzen

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

mit folgendem Code:

variable ??= expression;

Weitere Informationen finden Sie hier

nzrytmn
quelle
9

Um die Antwort von @ Dave zu erweitern ... wenn planRec.approved_by bereits eine Zeichenfolge ist

this.approved_by = planRec.approved_by ?? "";
Paul Alexander
quelle
2

Um eine nicht leere Variable zuzuweisen, ohne den tatsächlichen Variablennamen zu wiederholen (und ohne etwas zuzuweisen, wenn die Variable null ist!), Können Sie eine kleine Hilfsmethode mit einem ActionParameter verwenden:

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

Und dann benutze es einfach:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);
Jack Miller
quelle
1

Sie können dies auch in Ihrer Abfrage tun, z. B. in SQL Server-, Google- ISNULLund CASEintegrierten Funktionen.

user133371
quelle
-4

Ich benutze die Erweiterungsmethode SelfChk

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

Dann benutze gerne

string a = null;
"A".SC(ref a);
Ali Humayun
quelle
Ich denke du meinst aber nicht leicht zu lesen und zu verstehen, ist das so?
Ali Humayun
3
UPS! Sie haben absolut Recht: Sehr kurz, aber nicht leicht zu lesen und zu verstehen (zumindest wenn Sie nicht an diese Notation gewöhnt sind)
Jack Miller
In diesem Fall versuchen Sie, ein Buch zu lesen. Sie finden es sehr ausführlich und leicht zu verstehen: p
Ali Humayun