Подтвердить что ты не робот

Как вернуть пустую строку, если объект имеет значение null?

Вот фрагмент моего кода:

var link = socials.Where(p => p.type == Facebook).FirstOrDefault().URL;

проблема в том, что в списке нет социального объекта, FirstOrDefault() return null и .URL вызывает исключение.

Как я могу избежать этого в "одной" строке с LINQ? Таким образом, если null возвращает пустую строку "" (или пользовательскую еще лучше), else .URL?

4b9b3361

Ответ 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.