Overblog Suivre ce blog
Editer l'article Administration Créer mon blog

Présentation

  • : Romagny13 - Du .NET,du pur .NET
  • Romagny13 - Du .NET,du pur .NET
  • : Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions
  • Contact

Recherche

Articles Récents

10 juillet 2007 2 10 /07 /juillet /2007 23:53
[.NET 2.0] trier et filtrer avec les generics
I – Filtrer
Le filtre consiste à comparer chacun des elements de la liste par rapport à une condition (exemple StarstWith(« A »)),selon que cette condition est est remplie ou non ,true ou false indique en retour si l’objet en cours doit etre ajouté à la liste résultat
1 – avec les méthodes anonymes
 
private void button1_Click(object sender, EventArgs e)
        {
            // 1 avec méthode anonyme
            List<Contact> result = Contacts.FindAll(delegate(Contact oContact)
            {
                return oContact.ContactAge > 20;
            });
            dataGridView1.DataSource = result;
        }
 
2 – avec les Predicates (System.Predicate<T>)
Les Predicate ne sont en fait rien d’autre que des delegues generics, qui attendent une méthode devant respectant la signature attendue , c'est-à-dire retournant un bool et recevant en paramètre un objet du typeT defini explicitement
private void button1_Click(object sender, EventArgs e)
        {
            // 2 avec un Predicate (qui est un delegue)
            // Predicate<T> predicate = new Predicate<T>(bool(T) target)
            Predicate<Contact> predicate = new Predicate<Contact>(FindContacts);
            List<Contact> result = Contacts.FindAll(predicate);
            dataGridView1.DataSource = result;
        }
        public bool FindContacts(Contact oContact)
        {
         return oContact.ContactAge > 20;
        }
 
3 – en passant tout simplement une méthode respectant la signature des predicates
private void button1_Click(object sender, EventArgs e)
        {           
            List<Contact> result = Contacts.FindAll(FindContacts);
            dataGridView1.DataSource = result;
        }
        public bool FindContacts(Contact oContact)
        {
         return oContact.ContactAge > 20;
        }
 
Format de la méthode :
        public bool nommethod(T obj)
        {
         // test
         Return booleen;
        }
 
II Trier
1 – avec les méthodes anonymes
private void button2_Click(object sender, EventArgs e)
        {          
            Contacts.Sort(delegate(Contact x, Contact y)
            {
                return Comparer<string>.Default.Compare(x.ContactName, y.ContactName);
            });
        }
 
2 – avec Comparison<T>
Ici la méthode va servir à comparer deux instances de la liste generic par rapport à un property, le résultat de la comparaison sera soit
0 (equivalents)          -1          1
private void button2_Click(object sender, EventArgs e)
        {
            // Comparison<T> comparison =new Comparison<T>(int (T,T)target);
            Comparison<Contact> comparison = new Comparison<Contact>(SortContacts);
            Contacts.Sort(comparison);
            dataGridView1.DataSource = Contacts;
        }
        public int SortContacts(Contact x, Contact y)
        {
            return Comparer<string>.Default.Compare(x.ContactName, y.ContactName);
        }
 
3 – en passant tout simplement une méthode respectant la signature de comparison<T>
private void button2_Click(object sender, EventArgs e)
        {         
            Contacts.Sort(SortContacts);
            dataGridView1.DataSource = Contacts;
        }
        public int SortContacts(Contact x, Contact y)
        {
            return Comparer<string>.Default.Compare(x.ContactName, y.ContactName);
        }
 
Format de la méthode de tri
La méthode doit retourner un int
Le type K est le type des properties comparés(c’est un type value :int,string,etc.)
        public int nommethod(T x, T y)
        {
            return Comparer<K>.Default.Compare(x.property, y.property);
        }
 
Bien sur finalement et c’est l’objectif on peut combiner le tri et le filtre de manière de plus en plus complexe
Note : Avec Linq To Objects  lorsqu’on effectue un tri (clause Where) le tri est effectué sur la liste retournée en resultat et non sur la liste d’origine
En utilisant les méthodes décrites ici on peut trier aussi une liste autre que la liste d’origine par exemple la liste obtenue après un filtre mais si on utilise un IComparer ou IComparable défni directement dans la classe (ex : dans la classe contact) alors ce sera la liste d’origine qui sera trié, c’est à savoir quand même

Partager cet article

Repost 0
Published by Romagny13 - dans C 1.0- 2.0- 3.0
commenter cet article

commentaires

Florent Santin (Azra) 09/08/2007 17:08

Excelent résumé, je viens de tomber dessus, a garder en bookmark :)Merci!