A quoi correspond le mot clé let d’une expression Linq ?
Depuis .net 3.5, il est possible d’écrire des expressions Linq. Une expression Linq correspond à une expression utilisant les mots clé from, where, select, etc.
Le bout de code ci-dessous est une expression Linq.
int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 };
var lowNums =
from num in numbers
where num < 5
select num + 1;
Une expression Linq n’est qu’un sucre syntaxique : après compilation il n’y a plus de trace de ces expressions, elles sont transformés1 en code C# “classique”. Le code ci-dessus est donc strictement équivalent au code ci-dessous :
var lowNums = numbers
.Where(num => num < 5)
.Select(num => num + 1);
Pour en savoir plus sur Linq : Linq (Language Integrated Query) [MSDN]
Personnellement, je n’aime pas la syntaxe Linq. Je trouve que cette syntaxe est limitée, dès que l’on a besoin de faire des choses un peu complexe, on retourne sur une syntaxe “classique”.
Récemment, je me suis retrouvé en face d’une expression linq contenant le mot clé let. Ce mot clé permet de stocker temporairement le résultat d’une sous-expression.
Par exemple :
String sentence = "A penny saved is a penny earned.";
// Split the sentence into an array of words and select those whose first letter is a vowel.
var earlyBirdQuery =
from word in sentence.Split(' ')
let w = word.ToLower()
where w[0] == 'a' || w[0] == 'e' || w[0] == 'i' || w[0] == 'o' || w[0] == 'u'
select word;
Le code ci-dessus permet d’extraire tous les mots commençant par une voyelle d’une phrase. Le mot clé let permet ici de stocker le mot converti en minuscule.
Je me suis donc demandé comment était traduit ce mot clé. Si l’on regarde le code généré avec ILSpy on obtient le code suivant :
var earlyBirdQuery =
sentence.Split(' ')
.Select(word => new { Word = word, loweredWord = word.ToLower() })
.Where(o => o.loweredWord[0] == 'a' || o.loweredWord[0] == 'e' || o.loweredWord[0] == 'i' || o.loweredWord[0] == 'o' || o.loweredWord[0] == 'u')
.Select(o => o.Word);
Le mot clé let est donc traduit par une projection avec la création d’un type anonyme, il n’y a donc rien de magique.
Et vous, utilisez-vous les horribles mots clé Linq ?
1 : C’est, en fait un peu plus complexe car le code C# “classique” utilise les méthodes d’extension qui sont eux aussi un sucre syntaxique. De plus, si l’expression Linq se fait sur un IQueryable, alors C# va générer le code permettant d’avoir une instance d’une Expression.