Насколько я могу понять, linq метод FirstOrDefault()
возвраты null
если официальный набор документов пуст. Почему не может использовать ??
оператор против функции? Как так:
Double d = new Double[]{}.FirstOrDefault() ?? 0.0;
Обновление
Я не хочу проверять если d
null
позже в моем коде. И выполнение:
Double d new Double[]{}.FirstOrDefault() == null
? 0.0
: new Double[]{}.FirstOrDefault();
... или:
var r = new Double[]{}.FirstOrDefault();
Double d = r == null ? 0.0 : r;
... кажется небольшим излишеством - я хотел бы сделать эту пустую регистрацию одной строки кода.
Фактически, FirstOrDefault
возвращает T, которое является либо значением, либо значением по умолчанию (T)
.
по умолчанию (T)
либо null
, либо (T) 0
для типов значений (например, double
)
Поскольку оператор объединения со значением NULL ( ??
) применяется только к ссылочным типам, допускающим значение NULL, а Double является типом значения. Вместо этого вы можете использовать двойное значение, допускающее значение NULL ( double?
).
Метод называется FirstOrDefault, а не FirstOrNull, т.е. он вернет 0, значение по умолчанию для двойки в любом случае, поэтому нет необходимости в ?
Хотя другие ответили, почему у вас здесь проблемы с компиляцией, вы правы, что это проблематично для типов значений. Насколько мне известно, в этом случае невозможно узнать, был ли результат нулевым потому, что первый элемент действительно был нулем, или потому, что IEnumerable
был пустым.
В приведенном вами примере резервное значение в любом случае равно нулю, поэтому все, что вам нужно, это:
var r = new double[]{...}.FirstOrDefault();
Предполагая, что у вас было ненулевое резервное значение, у вас есть несколько вариантов:
var r = !myDoubles.Any() ? fallback : myDoubles.First();
или
var r = myDoubles.Cast<double?>().FirstOrDefault() ?? fallback;
Если у вас есть Zen Linq Extensions , вы можете:
var r = myDoubles.FirstOrFallback(fallback);
Сделать допускающим значение NULL
должно работать. Но затем вы сделаете его допускающим значение NULL
, все зависит от вашего сценария ...
Double d = new Double?[] { }.FirstOrDefault() ?? 0.0;