C# – La clause « Let » dans les requêtes LINQ

Lors de l’écriture de requêtes LINQ en C#, en raison de leur complexité ou par volonté d’optimisation des performances, il est parfois nécessaire de stocker le résultat d’une expression ou d’un traitement pour pouvoir l’utiliser dans les autres clauses des requêtes. La clause Let répond à ce besoin, en permettant de créer des variables locales à la requête LINQ qui sont typées à partir d’une expression que vous avez codée.
Voici un exemple : à partir d’une liste de chaînes de caractères où chacune d’entre elles contient le nom et le prénom d’une personne, vous souhaitez obtenir le nom des personnes commençant par la lettre « P » avec le nombre de caractères qu’il contient. Les espaces précédant le nom doivent être ignorés.
Voici la requête LINQ à implémenter :

List<string> listeIdentitesPersonnes = new List<string>() {
    " DURON Nicolas",
    "PERCEL Alain",
    "HEPRI Lisa",
    " PIREY    Dimitri"
};

List<string> listeNoms = (from identite in listeIdentitesPersonnes
                          let nom = identite.Split(' ')[0].Trim().ToUpper()
                          where nom.StartsWith("P")
                          select $"{nom} ({nom.Length})").ToList();

Est-il possible d’écrire cette requête LINQ sans utiliser la clause Let ? La réponse est oui, mais dans ce cas, le traitement du nom ne peut être factorisé :

List<string> listeNoms1 = (from identite in File.ReadAllLines("Data.txt")
   where identite.Split(' ')[0].Trim().ToUpper().StartsWith("P")
   select $"{identite.Split(' ')[0].Trim().ToUpper()} ({identite.Split(' ')[0].Trim().Length})").ToList();

Quel est l’impact sur les performances lorsque ces requêtes sont exécutées sur un important volume de données ? En faisant le test sur une liste de 10 000 000 000 d’identités, les résultats sont les suivants :

  • La durée d’exécution de la première requête LINQ (avec Let) est de 12,13 secondes
  • La durée d’exécution de la seconde requête LINQ (sans Let) est de 24,47 secondes

About: James RAVAILLE

Travaillant avec la plateforme Microsoft .NET depuis 2002, j’alterne les missions de formation et d’ingénierie avec cette plateforme. J’écris ce blog pour transmettre mes connaissances à tout développeur, qu’il soit débutant ou expérimenté.