Кратчайший способ проверить наличие нуля и присвоить другое значение, если нет

86

Я извлекаю varcharзначения из БД и хочу установить для stringприсваиваемых им значений "", если они есть null. Сейчас я делаю это так:

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

Кажется, должен быть способ сделать это в одной строке, например:

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

Однако я не могу найти оптимального способа сделать это. Есть ли способ лучше или я могу это сделать лучше всего?

Splashlin
источник
5
== true здесь излишни ...
cjk

Ответы:

104

Попробуй это:

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

Вы также можете использовать оператор объединения с нулем, как говорили другие, поскольку никто не привел пример, который работает с вашим кодом, вот один:

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

Но этот пример работает только потому, что возможное значение this.approved_byсовпадает с одним из потенциальных значений, которые вы хотите установить. Во всех остальных случаях вам нужно будет использовать условный оператор, как я показал в моем первом примере.

Эндрю Хэйр
источник
8
Разве этот оператор объединения с нулевым значением все равно не генерирует нулевую ссылку? Как я вижу этот код делает следующее: if (planRec.approved_by == null) { this.approved_by = planRec.approved_by.toString(); //<= nullref } else { this.approved_by = planRec.approved_by;}. Если я не прав, укажите на ошибку.
Destrictor
10
@Destrictor прав, код не работает. Вот исправление с использованием другого забавного оператора: this.approved_by = planRec.approved_by?.toString() ?? ""; <- Это оператор с нулевым условием, и я не думаю, что он был когда-то, когда этот вопрос был впервые задан и дан ответ. Надеюсь, OP это видит, поэтому он может провести рефакторинг своего 7-летнего кода, написанного двумя работами назад :).
Патрик
34

Оператор COALESCE (??) является то , что вы хотите, я считаю.

Дэйв Уорд
источник
4
Ага ... но только потому, что по умолчанию "".
Paul Alexander
Гм, как так? Можно использовать любое выражение для замены null на ...
TaW
30

Вы ищете оператор объединения C #: ??. Этот оператор принимает левый и правый аргумент. Если левая часть оператора имеет значение null или обнуляемое значение без значения, он вернет правый аргумент. В противном случае вернет левую.

var x = somePossiblyNullValue ?? valueIfNull;
ДжаредПар
источник
Этот ответ не охватывает все случаи из вопроса (только частично). Обратите внимание, что есть "string.IsNullOrEmpty". Таким образом, пустой случай здесь не обрабатывается.
Бронек
28

Думаю, лучшее, что вы можете придумать, это

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

Конечно, поскольку вы намекаете на то, что approved_byэто object(что не может равняться ""), это будет переписано как

this.approved_by = (planRec.approved_by ?? string.Empty).ToString();
Дмитрий Нестерук
источник
20

В C # 6 есть несколько более короткий способ для случая, когда planRec.approved_by не является строкой:

this.approved_by = planRec.approved_by?.ToString() ?? "";
Малькольм
источник
15

Используйте оператор объединения C #: ??

// if Value is not null, newValue = Value else if Value is null newValue is YournullValue
var newValue = Value ?? YourNullReplacement;
Рамги Борха
источник
15

Начиная с C # 8.0, вы можете использовать оператор ?? = для замены кода формы

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

со следующим кодом:

variable ??= expression;

Более подробная информация здесь

nzrytmn
источник
9

Чтобы расширить ответ @Dave ... если planRec.approved_by уже является строкой

this.approved_by = planRec.approved_by ?? "";
Пол Александр
источник
2

Чтобы назначить непустую переменную без повторения фактического имени переменной (и без присвоения чего-либо, если переменная равна нулю!), Вы можете использовать небольшой вспомогательный метод с Actionпараметром:

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

А потом просто используйте:

CallIfNonEmpty(this.approved_by, (s) => planRec.approved_by = s);
Джек Миллер
источник
1

Вы также можете сделать это в своем запросе, например, в sql server, google ISNULLи CASEвстроенных функциях.

пользователь133371
источник
-4

Я использую метод расширения SelfChk

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

Затем используйте как

string a = null;
"A".SC(ref a);
Али Хумаюн
источник
Я думаю, вы имеете в виду, но не легко читать и понимать, не так ли?
Али Хумаюн
3
UPS! Вы абсолютно правы: очень короткие, но НЕ легкие для чтения и понимания (по крайней мере, если вы не привыкли к этим обозначениям)
Джек Миллер
в таком случае попробуйте почитать книгу. Вы найдете это действительно подробным и простым для понимания: p
Али Хумаюн