Как вернуть пустую строку, если объект имеет значение null?
Вот фрагмент моего кода:
var link = socials.Where(p => p.type == Facebook).FirstOrDefault().URL;
проблема в том, что в списке нет социального объекта, FirstOrDefault()
return null
и .URL
вызывает исключение.
Как я могу избежать этого в "одной" строке с LINQ? Таким образом, если null возвращает пустую строку ""
(или пользовательскую еще лучше), else .URL
?
Ответы
Ответ 1
Вы можете использовать DefaultIfEmpty
с аргументом для указания резервного значения:
var link = socials
.Where(p => p.type == Facebook)
.Select(p => p.Url)
.DefaultIfEmpty("")
.First();
FirstOrDefault
больше не требуется, безопасно использовать First
с DefaultIfEmpty
.
Ответ 2
Другой вариант - использовать оператор null coalesce
var link = (socials
.Where(p => p.type == Facebook)
.Select(p => p.Url)
.FirstOrDefault()) ?? string.empty;
Я понял, что string.empty
предпочтительнее ""
, но это может быть не так - см. комментарий ниже.
UPDATE
В С# 6 существует нулевой условный оператор (также известный как оператор "Элвис" ):
var link = socials
.Where(p => p.type == Facebook)
.Select(p => p.Url)
.FirstOrDefault()?.URL ?? string.empty;
Простой пример:
stringbuilder sb = null;
// do work
string s = sb?.ToString() ?? "no values found";
Ответ 3
С помощью С# 6 вы можете использовать оператор с нулевым условием (?.
), чтобы вернуть URL-адрес, если объект, возвращаемый из оператора LINQ не null
, т.е. если было найдено значение, или null
otherwsie.
var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL;
Если вы хотите изменить значение null
на пустую строку или настраиваемую строку, используйте оператор с нулевым коалесцированием (??
).
var link = socials.Where(p => p.type == Facebook).FirstOrDefault()?.URL ?? "No URL";
Следует отметить, что это не делает различий между тем, был ли найден объект или обнаружен объект, но имеет значение null
URL.