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

LINQ - FirstOrDefault(), затем Select()

У меня есть следующий запрос LINQ, который запускает и исключает, когда FirstOrDefault() возвращает null. В идеале я бы хотел избежать нулевой проверки. Есть ли способ сделать это? Я хочу вернуть 0, если нет CPOffsets, которые удовлетворяют вызову FirstOrDefault().

double offset = OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime).CPOffset;

Единственный способ, который я вижу для достижения этого, - это следующее:

CPOffset cpOffset = OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime);
double offset = cpOffset != null ? cpOffset.CPOffset : 0;

Есть ли еще более сжатый способ? Использование Select() после того, как FirstOrDefault() не скомпилируется, но я подумал, что здесь может быть уместно?

4b9b3361

Ответ 1

Я думаю, что это должно сработать, я не рядом с VS, чтобы проверить это...

OrderedOffsets.Where(o => o.OffsetDateTime > cpTime).Select(x => x.CPOffset).FirstOrDefault();

Ответ 2

DefaultIfEmpty может использоваться, чтобы гарантировать, что коллекция всегда имеет хотя бы один элемент.

double offset = OrderedOffsets.Where(o => o.OffsetDateTime > cpTime)
    .Select(o => o.CPOffset)
    .DefaultIfEmpty()
    .First();

Ответ 3

Я думаю, что хороший шаблон может быть:

double offset = (OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime) ?? someDefaultObject).CPOffset;

с someDefaultObject объектом, содержащим значения по умолчанию... С помощью этого шаблона вы можете легко изменить значения по умолчанию через свой код!

Если OrderedOffsets может быть структурой, вы также можете просто поместить свое значение по умолчанию!:)