using System;
using System.Collections.Generic;
using System.Linq;

namespace ExempleCompletLINQ
{
    public class Etudiant
    {
        public string Nom { get; set; }
        public string Prenom { get; set; }
        public UInt16 Age { get; set; }
        public UInt32 CodeApogee { get; set; }

        public Etudiant(string nom, string prenom, UInt16 age, UInt32 codeApogee)
        { Nom = nom; Prenom = prenom; Age = age; CodeApogee = codeApogee; }

        public override string ToString()
        { return (CodeApogee + ":" + Nom + " " + Prenom + " age de " + Age.ToString() + " ans"); }

    }
    class Program
    {
        static void Main(string[] args)
        {   // creation dictionnaire
            var dicLPSE = new Dictionary<UInt32, Etudiant>();
            // ajout des entrees
            dicLPSE.Add(1, new Etudiant("Oscar", "Amel", 20, 100213));
            dicLPSE.Add(2, new Etudiant("Copter", "Elie", 21, 110214));
            dicLPSE.Add(3, new Etudiant("aaaa", "bbb", 20, 110216));
            dicLPSE.Add(4, new Etudiant("aaaa", "dddd", 21, 100215));

            Console.WriteLine("Dictionnaire non trié");
            IEnumerable<KeyValuePair<UInt32, Etudiant>> request1 = from keyValue in dicLPSE  // pour elt du dictionnaire(donc un couple <cle,valeur> )
                                                                   where (keyValue.Value.CodeApogee > 100000) && (keyValue.Value.CodeApogee < 110000) // filtre
                                                                   select keyValue; // renvoie les <cle,valeur> correspondant
            foreach (var kv in request1) // request1 est une collection de <cle,valeur>
                Console.WriteLine(kv.Value); //  kv.Value est une etudiant , appel à la surchage ToString
            Console.WriteLine("---------------------------------------");
            var request2 = from keyValue in dicLPSE  // var de type IEnumerable<KeyValuePair<UInt32,Etudiant>>
                           where (keyValue.Value.Age == 20) // filtre age=20
                           orderby keyValue.Value.Nom// trie ascendant du resultat de filtrage
                           select keyValue; // renvoie des valeur keyValue
            foreach (var kv in request2)
                Console.WriteLine(kv.Value);
            Console.WriteLine("---------------------------------------");
            var request3 = from keyValue in dicLPSE
                           // tries enchainés: par age decendant , puis pas nom, puis par prenom
                           orderby keyValue.Value.Age descending, keyValue.Value.Nom, keyValue.Value.Prenom
                           select keyValue;
            foreach (var kv in request3)
                Console.WriteLine(kv.Value);
            Console.WriteLine("---------------------------------------");
            var request4 = from keyValue in dicLPSE
                           where (keyValue.Value.Nom).StartsWith("aa") // filtre Nom commencant par "aa"
                           where (keyValue.Value.Age == 20) //puis filtre Age=20
                           select keyValue; // projection des valeurs
            foreach (var kv in request4)
                Console.WriteLine(kv.Value);
            Console.WriteLine("---------------------------------------");
            var request5 = from keyValue in dicLPSE
                           // constition de groupe en fonction des 2 premier chiffre du code Apogee
                           group keyValue by (keyValue.Value.CodeApogee.ToString()).Substring(0, 2) into grps
                           select grps; // projection des ssgroupe
            foreach (var ssgroupe in request5) // pour chaque ssgroupe de la requete
            {
                Console.WriteLine(" groupe ayant pour cle " + ssgroupe.Key);
                foreach (var kv in ssgroupe) // pour chaque elt des sousgroupe
                    Console.WriteLine(kv.Value); // affiche etudiant
            }
            Console.WriteLine("---------------------------------------");
            var request6 = from ssgrpe in request5 // pour chaque ssgrpe de la requete 5
                           from kv in ssgrpe  // pour chaque elt des sous-groupes
                           where kv.Value.Age == 20 // ne retient que cerux dont Age=20
                           select kv; //projection des elts
            foreach (var kv in request6)
                Console.WriteLine(kv.Value);

            Console.ReadKey();
        }
    }
}
