Usando os recursos de compreensão de consulta dos compiladores C #, você pode escrever código como:
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;
Na expressão de consulta acima, a let
palavra - chave permite que um valor seja passado para as operações where e orderby sem chamadas duplicadas para animalName.Length
.
Qual é o conjunto equivalente de chamadas do método de extensão LINQ que alcança o que a palavra-chave "let" faz aqui?
c#
linq
extension-methods
linq-to-objects
LBushkin
fonte
fonte
Respostas:
Let não tem operação própria; ele pega carona
Select
. Você pode ver isso se você usar o "refletor" para separar uma dll existente.será algo como:
fonte
.Dump()
método de extensão no LinqPad para ver o lambda resultante.Há um bom artigo aqui
let
Cria essencialmente uma tupla anônima. É equivalente a:fonte
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
Há também um método de extensão .Let no System.Interactive, mas seu objetivo é introduzir uma expressão lambda para ser avaliada 'in-line' em uma expressão fluente. Por exemplo, considere (no LinqPad, por exemplo) a seguinte expressão que cria novos números aleatórios toda vez que é executado:
Para ver que novas amostras aleatórias aparecem sempre, considere o seguinte
que produz pares nos quais esquerda e direita são diferentes. Para produzir pares nos quais esquerda e direita são sempre iguais, faça algo como o seguinte:
Se pudéssemos invocar expressões lambda diretamente, poderíamos escrever
Mas não podemos invocar expressões lambda como se fossem métodos.
fonte
sobre Código equivalente à palavra-chave 'let' nas chamadas do método de extensão LINQ em cadeia
o comentário acima não é mais válido
produz
tão múltiplos
let
são otimizados agorafonte