Используя функции понимания запросов компиляторами C #, вы можете написать код:
var names = new string[] { "Dog", "Cat", "Giraffe", "Monkey", "Tortoise" };
var result =
from animalName in names
let nameLength = animalName.Length
where nameLength > 3
orderby nameLength
select animalName;
В приведенном выше выражении запроса let
ключевое слово позволяет передавать значение в операции where и orderby без повторных вызовов animalName.Length
.
Каков эквивалентный набор вызовов метода расширения LINQ, который достигает того, что здесь делает ключевое слово "let"?
c#
linq
extension-methods
linq-to-objects
LBushkin
источник
источник
Ответы:
Пусть не имеет своей собственной операции; это свиные спины
Select
. Вы можете увидеть это, если вы используете «рефлектор», чтобы отделить существующую DLL.это будет что- то вроде:
источник
.Dump()
метод расширения в LinqPad, чтобы увидеть результирующую лямбду.Там хорошая статья здесь
По сути
let
создает анонимный кортеж. Это эквивалентно:источник
it seems prudent to recommend against using the let keyword in cases where you do not need to transform a variable
This could be considered a micro-optimisation
В System.Interactive также есть метод расширения .Let, но его цель - ввести лямбда-выражение, которое будет оцениваться «in-line» в беглом выражении. Например, рассмотрим (скажем, в LinqPad) следующее выражение, которое создает новые случайные числа при каждом его выполнении:
Чтобы увидеть, что новые случайные выборки появляются каждый раз, рассмотрите следующее
который производит пары, в которых левый и правый различны. Чтобы создать пары, в которых левый и правый всегда одинаковы, сделайте что-то вроде следующего:
Если бы мы могли вызывать лямбда-выражения напрямую, мы могли бы написать
Но мы не можем вызывать лямбда-выражения, как если бы они были методами.
источник
о коде, эквивалентном ключевому слову let в вызовах метода расширения LINQ
вышеуказанный комментарий больше не действителен
производит
так что несколько
let
оптимизированы сейчасисточник