Le Beaba Linq

Publié le 17 juillet 2008 par Jeremy.jeanson
Hors mis si vous êtes un extraterrestre, nul doute que vous avez entendu parler de Linq. Mon objectif n'étant pas ici de refaire un long discours sur le pourquoi et le comment de Linq, je vais présenter ici quelques bases de l'utilisation de Linq.
Avant toute chose pensez à ajouter la ligne suivant à votre code C#... Oui cela peut sembler idiot, mais combien de fois allez vous chercher pourquoi Intellisence ne fonctionne plus.
using System.Linq;
Allons dans le vif du sujet et décorticons les lignes suivantes :
String[] table = { "z", "c", "d", "b" };
var req = from s in table
   select s;
Pourquoi utiliser [s] ??? [s] est utilisé ici pour représenter les objets qui seront manipulées (après, s ou un autre nom de variable c'est une histoire de goûts). Donc on pourrait traduire la première ligne en :"à parir de tout élément [s] dans [table]", et la seconde ligne par :"selectionner [s]"... facile non?
Ensuite pour faire des tris on peut utiliser le code suivant:
var req = from s in table
   orderby s descending
   select s;
Dans ce cas on fait un trie décroissant. pour faire l'inverse il suffit de supprimer le mot [descending].
On peut aussi faire des opérations de mise en forme sur la sortie:
var req = from s in table
   orderby s descending
   select s.ToUpper();
Mais surtout, travailler avec de vrais objets (on peut noter au passage l'écriture de propriétés, l'instanciation C# 3 et le trie sur plusieurs accesseurs):
private class Personne
{
   public String Nom { get; set; }
   public String Prenom { get; set; }
}
Personne[] personnes = new Personne[]{
   new Personne(){Nom="Duc","Donald"},
   new Personne(){Nom="Emard","Jean"},
   new Personne(){Nom="Capt","Hadock"}
   };
var req = from p in personnes
   orderby p.Nom, p.Prenom
   select p;

C'est ici que Linq commence à être sympathique, car on peut envisager de ne selectionner qu'une partie de l'objet et ainsi obtenir une énumération d'un autre type :
var req = from p in personnes
   orderby p.Nom, p.Prenom
   select p.Prenom;
   }

Voir même de créer de nouveaux types:
var req = from p in personnes
   orderby p.Nom, p.Prenom
   select new { miniNom = p.Nom.ToUpper(), maxiNom = p.Nom.ToUpper() };

Il va s'en dire qu'il existe aussi la possibilité de filtre sa requête Linq:
var req = from p in personnes
   where p.Nom == "Duc"
   orderby p.Nom, p.Prenom
   select p;

Rien de très compliqué en fait. Dans un prochain post je ferai une présnetaiton de Linq plus avancées démontrant vraiemnt la puissance de cette outils que j'ai tendence à surnomer affectueusement de "Couteau Suisse" tellement il regorde de possibilités.
Sur ce, bonne découverte de Linq.