2014-02-14 2 views
1

У меня есть список деталей в partList. Я хочу получить Name части, фильтруя Number. Что-то вродеИнтеграция проверки NULL в LINQ

var foundPart = partList.Where(part => part.Number == 1).SingleOrDefault(); 
if(foundPart != null) 
    name = foundPart.Name; 

Могу ли я устранить null чек и поставить все в команде LINQ?

+1

Я бы придерживаться текущей проверки нулевой, гораздо более удобным для чтения, чем все остальное на основе на нуль-коалесцирующем операторе ИМХО. – ken2k

+0

Разве вы не можете сделать это в своем первоначальном создании partList? –

+0

@ ken2k На самом деле мне также нравятся простые 'if',' foreach' и т. Д., И используйте их, когда это возможно. Потому что это очень просто понять. И я считаю, что код, который легко понять, является лучшим кодом –

ответ

8
string name = partList.Where(part => part.Number == 1) 
         .Select(part => part.Name) // project result here 
         .SingleOrDefault(); 

Если вы хотите, чтобы избежать изменения имени, когда не найдено:

name = partList.Where(part => part.Number == 1) 
       .Select(part => part.Name) 
       .DefaultIfEmpty(name) 
       .Single(); 

ПРИМЕЧАНИЕ: Я люблю LINQ, но в этом случае я бы упростить запрос немного и держать если состояние. Очень ясно и просто понять:

var part = parts.SingleOrDefault(p => p.Number == 1); 

if(part != null) 
    name = part.Name; 
+0

Это установит значение null в «name»; в настоящее время OP не обновляет «имя», если нет результата. – ken2k

+0

@ ken2k спасибо, пропустил эту часть. Обновленный ответ –

2

Что произойдет, если foundPart is null?

Если вы нормально с name существом нуль:

var name = partList 
      .Where(part => part.Number == 1) 
      .Select(part => part.Name) 
      .SingleOrDefault(); 

Если вы хотите, чтобы установить его на что-то другое, используйте оператор нуль-коалесцирующий:

var name = partList 
      .Where(part => part.Number == 1) 
      .Select(part => part.Name) 
      .SingleOrDefault() ?? "Default Name"; 

Если вы не хотите коснуться name, тогда нет способа упростить то, что у вас уже есть.

-1

Вы можете просто использовать .FirstOrDefault() вместо .SingleOrDefault()

var foundPart = partList.Where(part => part.Number == 1).FirstOrDefault() ?? "Default"; 
Смежные вопросы