2015-08-21 3 views
23

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

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

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

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

+0

вы можете использовать .First(); –

+8

@SirwanAfifi: вызывает исключение, если нет типа == facebook. –

ответ

40

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

var link = socials 
    .Where(p => p.type == Facebook) 
    .Select(p => p.Url) 
    .DefaultIfEmpty("") 
    .First(); 

FirstOrDefault не нужно больше, это безопасно использовать First с DefaultIfEmpty.

+0

Но DefaultIfEmpty работает, даже если объект Select return 0? Я имею в виду, если число count равно 0, оно возвращает хотя бы одно значение ""? – markzzz

+3

Да, это единственная цель 'DefaultIfEmpty'. Он приходит только в игру, если последовательность не содержит элементов. Затем он использует значение по умолчанию для этого типа или - если вы используете перегрузку, как в моем ответе, - он использует предоставленное значение. Таким образом, с тем же результатом, как если бы последовательность содержала только один элемент с этим значением. –

15

Другой вариант заключается в использовании NULL оператор Coalesce

var link = (socials 
    .Where(p => p.type == Facebook) 
    .Select(p => p.Url) 
    .FirstOrDefault()) ?? string.empty; 

я понял, что string.empty предпочтительнее "", но это не может быть случай - см комментарии ниже.

ОБНОВЛЕНИЕ В C# 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"; 
+5

Почему 'string.empty' предпочитают более' '' '? Это просто личные предпочтения. Imo '' '' очень ясно. –

+2

Существует тонкая разница между вашим и моим ответом. Вы получаете 'String.Empty', если нет' type == facebook', а также если первый совпадающий 'Url' равен' null'. [Мой подход] (http://stackoverflow.com/a/32138070/284240) по-прежнему дает «null» в этом случае. –

+0

http://stackoverflow.com/questions/263191/in-c-should-i-use-string-empty-or-string-empty-or – Steve

6

Использование C# 6 вы может использовать null-conditional operator (?.), чтобы вернуть URL-адрес, если объект, возвращаемый из оператора LINQ, не равен null, то есть если значение было найдено или null otherwsie.

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

Если после этого вы хотите, чтобы изменить значение null в пустую строку или пользовательская строка затем использовать null-coalescing operator (??).

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

Следует отметить, что это не будет делать различия между ли не обнаружен объект или объект был найден, но имел значение в null URL.

Смежные вопросы