Overblog Tous les blogs Top blogs Économie, Finance & Droit Tous les blogs Économie, Finance & Droit
Editer l'article Suivre ce blog Administration + Créer mon blog
MENU

Cycle de progression Faire (quelque chose qui marche) -> comprendre ce que l’on fait/comment cela marche -> pousser plus loin les notions

Publicité

[.NET 2.0] trier et filtrer avec les generics

[.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
Publicité
Retour à l'accueil
Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
F
Excelent résumé, je viens de tomber dessus, a garder en bookmark :)Merci!
Répondre