Просто дополнение, вы можете позвонить Nullable.GetValueOrDefault()
Пример:
if (dateTime1.GetValueOrDefault() < dateTime2)
...
Если вы спрашиваете с точки зрения производительности, reduce
немного лучше:
(time (dotimes [_ 1e6] (apply + (filter even? (range 1 20)))))
"Elapsed time: 9059.251 msecs"
nil
(time (dotimes [_ 1e6] (reduce + (filter even? (range 1 20)))))
"Elapsed time: 8420.323 msecs"
nil
В этом случае разница примерно 7%, но YMMV в зависимости от машины .
Вы не предоставили исходный код для функции prime?
, поэтому я заменил даже?
в качестве предиката. Имейте в виду, что в вашей среде выполнения может доминировать prime?
, и в этом случае выбор между reduce
и apply
имеет еще меньшее значение.
Если вы являетесь спрашивая, какая из них более «шепчуща», я бы сказал, что реализация reduce
предпочтительнее, так как то, что вы делаете, это сокращение / сворачивание в смысле функционального программирования.
Я ожидал, что это применимо для реализации ленивого списка, который может быть уродливым, и вы никогда не захотите предполагать, что ваш список не ленивый, потому что вы можете внезапно столкнуться с огромным использованием памяти.
Reduce собирает их по одному и объединяет результаты в одно целое, никогда не беря весь список сразу.
Я бы подумал, что reduce
будет предпочтительнее, если он доступен, потому что apply
использует список в качестве аргументов функции, но когда у вас есть большое количество - скажем, миллион - элементов в списке, вы создадите вызов функции с миллионом аргументов! Это может вызвать некоторые проблемы с некоторыми реализациями Lisp.
(уменьшить op ...) является нормой и (apply op ...) исключением (особенно для str и concat).