Для выражений запроса это представляет собой функцию идентификации :
from c in valueToMatch select c
Это означает, что результат выражения будет точно равен входному значению matchToValue
. Поэтому приведенные вами примеры семантически эквивалентны.
В случае выбора без идентификации, например:
from c in valueToMatch select c + ";"
создается IEnumerable<char>
, который, при перечислении , будет использовать содержимое valueToMatch
и изменять его.
Этот звонок:
(from c in valueToMatch select c + ";").Any(c => Char.IsDigit(c))
перечисляет внутренний запрос, пока не найдет совпадение. Как видите, независимо от исходного запроса он не будет выполняться до вызова Any
. Экземпляр IEnumerable<char>
представляет возможность запуска запроса, а не запроса, который уже был выполнен. Эта концепция известна как отложенное выполнение .