Термин Короткое замыкание здесь не применимо, потому что это около boolean evaluation. См. Некоторые примеры here. Он не применяется, потому что Take
не возвращает логическое значение.
Что вы, вероятно, хотите задать: Take
выполнить, если Any
является следующим методом в строке? Логически, Take
может быть пропущен, если также выполняется Any
, потому что Any
также останавливается после того, как нашел первый матч.
Однако, мы просто смотрим на пару методов расширения, называемых последовательно:
value = MyDataTable.AsEnumerable() _
.Where(Function(DateRow) DataRow.Item("MyColumn").ToString = "Y") _
.(Take(1)) _
.Any()
So Take
бежит, а затем любой метод случается прийти на следующий, в этом случае Any
. Как бы Take
знать, что его не нужно запускать? Это можно легко продемонстрировать, если вы создаете собственные методы расширения из source code и добавляете инструкции trace.
Возможно, основной вопрос заключается в том, имеет ли значение производительность? Ну, это две итерации (вершины) против одной, пытаясь предотвратить ее, это будет микро-оптимизация.
Оба. Take возьмет только первую 1 запись, а затем любое короткое замыкание, как только найдет ту, которая соответствует (но из-за берется только максимум 1). Вы можете безопасно удалить Take 1 и иметь такую же производительность. –
Удивительно, спасибо за ответ! –
@RobertMcKee Это должен быть ответ, а не комментарий ... –