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

2 avril 2007 1 02 /04 /avril /2007 09:56
IComparable et IComparer
pour trier ses tableaux ou collections sous .NET 1 .x et .NET 2.0
 
I - IComparable
 
1 – [.NET 2.0] – avec une collection générique
A -La collection
using System;
using System.Collections.Generic;
using System.Text;
 
namespace TestICompare
{
    public class ContactCollection : System.Collections.Generic.List<Contact>
    {
    }
}
 
B -La classe unitaire
-           une partie « classique » ou l’on définie les propriétés de la classe (ici name et firstname)
-          Implémentation de l’interface IComparable :
o   la classe hérite de IComparable
o   la classe implémente la méthode >> int CompareTo(object obj)
celle-ci compare 2 valeurs et renvoie un entier résultat de la comparaison (soit -1,0 ou 1) .
using System;
using System.Collections.Generic;
using System.Text;
 
namespace TestICompare
{
     public class Contact : IComparable<Contact>
    {
        public string Name;
        public string FirstName;
 
        public Contact(string Name, string FirstName)
        {
            this.Name = Name;
            this.FirstName = FirstName;
        }
 
 
       // Implementation de IComparable
       #region IComparable<Contact> Membres
 
        int IComparable<Contact>.CompareTo(Contact other)
        {
            // ordre croissant (du plus petit au plus grand) - Aplhabètique
            return this.Name.CompareTo(other.Name);
          
            //// ordre decroissant
            // return other.Name.CompareTo(this.Name);
        }
 
        #endregion
   }
}
 
 
C - Utilisation
On affiche tout simplement dans une listbox une collection de contacts d’abord telle qu’elle a été ajoutée (dans l’ordre d’ajout)
Puis on trie avec la méthode sort de la collection et on affiche cette même collection mais triée cette fois –ci .
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace TestICompare
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        ContactCollection oContacts;
 
        private void btnAdd_Click(object sender, EventArgs e)
        {
            oContacts = new ContactCollection();
            oContacts.Add(new Contact("zorro", "don die"));
            oContacts.Add(new Contact("Alba", "leon"));
            oContacts.Add(new Contact("Durand", "pierre"));
            foreach (Contact oContact in oContacts)
            {
                listBox1.Items.Add(oContact.Name);
            }
        }
 
        private void btnSort_Click(object sender, EventArgs e)
        {           
            oContacts.Sort();
            foreach (Contact oContact in oContacts)
            {
                listBox2.Items.Add(oContact.Name);
            }
        }
    }
}
 
2 - Avec un ArrayList [.NET 1.x]
 
A - La classe unitaire (semblable)
using System;
using System.Collections.Generic;
using System.Text;
 
namespace TestICompare
{
    public class Contact : IComparable
    {
        public string Name;
        public string FirstName;
 
        public Contact(string Name, string FirstName)
        {
            this.Name = Name;
            this.FirstName = FirstName;
        }
 
 
       // Implementation de IComparable
        #region IComparable Membres
 
        public int CompareTo(object obj)
        {
            int nResult=0;
 
            if (obj.GetType() != typeof(Contact))
            { }
            else
            {
                // renvoie 1 si this.nom commence par ex par z et nom comparer par a
                // -1 inverse
                nResult =this.Name.CompareTo(((Contact)obj).Name);
            }
            return nResult;
        }
 
        #endregion
    }
}
 
 
B - Utilisation
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
 
namespace TestICompare
{
    public partial class Form1 : Form
    {
       public Form1()
        {
            InitializeComponent();
        }
 
        System.Collections.ArrayList oArray;
 
        private void btnAdd_Click(object sender, EventArgs e)
        {
           
            oArray = new System.Collections.ArrayList();
            oArray.Add(new Contact("zorro", "don die"));
            oArray.Add(new Contact("Alba", "leon"));
            oArray.Add(new Contact("Durand", "pierre"));
 
            foreach (Contact oContact in oArray)
            {
                listBox1.Items.Add(oContact.Name);
            }
 
        }
 
        private void btnSort_Click(object sender, EventArgs e)
        {         
            oArray.Sort();
            foreach (Contact oContact in oArray)
            {
                listBox2.Items.Add(oContact.Name);
            }
 
        }
    }
}
 
II - IComparer – pour personnaliser le trie
 
-          Chaque classe implémentant  doit être imbriquée
-          Chaque classe implémente la méthode Compare(object x,Object y)
-          On peut trier la totalité de la collection – dans l’ordre croissant
Exemple avec une collection générique
A - La classe collection
using System;
using System.Collections.Generic;
using System.Text;
 
namespace TestICompare
{
    public class ContactCollection : System.Collections.Generic.List<Contact>
    {
    }
}
 
using System;
using System.Collections.Generic;
using System.Text;
 
namespace TestICompare
{
    public class Contact : IComparable<Contact>
    {
        ///<summary>
        ///
        ///</summary>
        public class FirstNameComparer : IComparer<Contact>
        {
          #region IComparer<Contact> Membres
 
            int IComparer<Contact>.Compare(Contact x, Contact y)
            {
                // ordre croissant - alphabetique
                return y.FirstName.CompareTo(x.FirstName);
 
                // ordre decroissant
                // return x.FirstName.CompareTo(y.FirstName);
            }
 
            #endregion
        }
 
 
        public string Name;
        public string FirstName;
 
        public Contact(string Name, string FirstName)
        {
            this.Name = Name;
            this.FirstName = FirstName;
        }
 
    }
}
 
C - Utilisation
 
oContacts.Sort(new Contact.FirstNameComparer());
 
            foreach (Contact oContact in oContacts)
            {
                listBox2.Items.Add(oContact.Name + "   " + oContact.FirstName);
            }
 
 
Dernier point >> ne comparer qu’une partie de la collection
// sort(IndexDepart,NbElements,IComaprer<I> comparer)
            oContacts.Sort(1, 2, new Contact.FirstNameComparer());
 
 
 

Partager cet article

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

commentaires