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?


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.


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


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;

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();

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() ?? "";

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;

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



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);

1

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


-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);

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.