Korzystając z funkcji rozumienia zapytań kompilatorów C #, możesz pisać kod taki jak:
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;
W powyższym wyrażeniu zapytania let
słowo kluczowe pozwala na przekazanie wartości do operacji where i uporządkowanie bez powielania wywołań animalName.Length
.
Jaki jest równoważny zestaw wywołań metod rozszerzenia LINQ, który osiąga to, co robi słowo kluczowe „let”?
c#
linq
extension-methods
linq-to-objects
LBushkin
źródło
źródło
Odpowiedzi:
Niech nie ma własnej operacji; to piggy-backs z
Select
. Możesz to zobaczyć, jeśli użyjesz „reflektora”, aby rozdzielić istniejącą bibliotekę DLL.będzie to coś w rodzaju:
źródło
.Dump()
metody rozszerzenia w LinqPad, aby zobaczyć wynikową lambda.Jest to dobry artykuł tutaj
Zasadniczo
let
tworzy anonimową krotkę. Jest to równoważne z:źródło
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
W System.Interactive istnieje również metoda rozszerzenia .Let, ale jej celem jest wprowadzenie wyrażenia lambda, które będzie oceniane jako „w linii” w płynnym wyrażeniu. Na przykład, rozważ (powiedzmy w LinqPad) następujące wyrażenie, które tworzy nowe liczby losowe za każdym razem, gdy jest wykonywane:
Aby zobaczyć, że nowe losowe próbki pojawiają się za każdym razem, rozważ następujące kwestie
który tworzy pary, w których lewy i prawy są różne. Aby utworzyć pary, w których lewa i prawa są zawsze takie same, wykonaj następujące czynności:
Gdybyśmy mogli bezpośrednio wywoływać wyrażenia lambda, moglibyśmy pisać
Ale nie możemy wywoływać wyrażeń lambda tak, jakby były metodami.
źródło
o kodzie równoważnym słowu kluczowemu „let” w połączonych wywołaniach metod rozszerzenia LINQ
powyższy komentarz nie jest już ważny
produkuje
więc wiele
let
jest teraz zoptymalizowanychźródło