Group by Linq Avancé

Publié le 17 juillet 2008 par Jeremy.jeanson
Quand on travail avec Linq, il arrive ce moment fatidique où l'on se demande comment faire des groupes, et là en général ça se corse, alors comment faire?
Un simple code vaut mieux que de bien trop longs discourts:
private class Personne
{
   public String Nom { get; set; }
   public String Prenom { get; set; }
   public Int32 Age { get; set; }
}
Personne[] personnes = new Personne[]{
   new Personne(){Nom="Duc","Donald",30},
   new Personne(){Nom="Emard","Jean",25},
   new Personne(){Nom="Capt","Hadock",10},
   new Personne(){Nom="Duc","Riri",10},
   new Personne(){Nom="Duc","Fifi",11},
   new Personne(){Nom="Duc","loulou",10}
   };
var req = from p in personnes
   group p by p.Nom into g
   select g.Count();

On groupe ici nos personne par nom et on les compte, rien de très compliqué mais il nous arrive souvent d'avoir besoin de ce genre de codes (pour la somme on emploi le même principe).
Histoire d'être claire la ligne group by signifie : "grouper [p] par sa propriété [Nom] et mettre se groupe dans [g]".
Mais comment faire quand on veut grouper sur le nom et l'age de nos personne?...
La solution mirracle: les type anonymes
var req = from p in personnes
   group p by new { p.Nom, p.Age } into g
   select new { Count = g.Count(), Age = g.Key.Age };

Comme on le voit ici, on peut même utiliser notre groupe pour retrouver les critères de regroupement et utiliser leurs valeurs.
Ahhh Linq, quand tu nous tiens!