2013-08-07 5 views
3

В настоящее время я возвращаю список элементов, все из которых имеют диапазон дат. Некоторые из назначений истекли, а другие еще не были. Я показываю встречи, которые еще не истекли. Но я хочу проверить, истек ли срок действия всех приложений, а затем показать первый элемент.Проверка на возврат null элементов

var curApt = myAppts.Where(d => d.Appt.EndTime > DateTime.UtcNow).First(); 

Если myAppts.Where(d => d.Appt.EndTime > DateTime.UtcNow) == null

var curApt = myAppts.First(); 

как я могу структурировать это так я рассматривать оба дела?

+1

Просто чтобы добавить информацию, .First() выкинет исключение, если нет каких-либо значений (т. Е. Нет квартир с EndTime), а не возврата Null. Как и все ответы, используйте .FirstOrDefault() (или, если необходимо, .FirstOrDefaut (where where)). Вы используете .First(), если вы точно знаете, что каждый раз, когда это когда-либо будет выполняться, будет проведено хотя бы одно оцениваемое значение. – Tory

ответ

4

FirstOrDefault и null coalescing operator (??):

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow) 
      ?? myAppts.First(); 

Однако, вы могли бы сделать это еще менее исключение склонным если у вас есть значение по умолчанию, чтобы показать, если нет назначения на всех, вы можете приковать нулевой оператор коалесцирующего для что:

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow) 
      ?? myAppts.FirstOrDefault() ?? yourDefault; 
1

Это звучит, как вы хотите использовать .FirstOrDefault() здесь:

var curApt = myAppts.Where(d => d.Appt.EndTime > DateTime.UtcNow).FirstOrDefault(); 
if (curApt == null) { 
    // no expirations 
    curApt = myAppts.First(); 
} 
2

Вы можете использовать FirstOrDefault метод:

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow); 

Чтобы найти первый, не истек, или null если все назначения истекли. Таким образом, по умолчанию его первого назначения в этом случае, вы можете использовать это:

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow); 
if (curApt == null) 
{ 
    curApt = myAppts.First(); 
} 

Или вы можете использовать Используйте null-coalescing operator (??) для краткости:

var curApt = myAppts.FirstOrDefault(d => d.Appt.EndTime > DateTime.UtcNow) 
      ?? myAppts.First(); 
+0

+1 для упоминания давно забытой перегрузки FirstOrDefault, которая берет предикат. –

1

Использование FirstOrDefault() вместо первой() , а после первого оператора проверить, является ли curApt равным null, и если это так, то второй оператор.

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