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

3 août 2007 5 03 /08 /août /2007 22:21
Avoir plusieurs signatures pour accéder aux éléments d’une collection
 
Peut être avez-vous déjà remarqué que lorsque vous accédez à certaines collections du framework vous avez plusieurs signatures
Exemple avec un DataSet lorsque l’on désire accéder à une DataTable de ce DataSet on fait :
dataSet.Tables[0]
ou
dataSet.Tables[« nomtable »]
Cet article explique comment on peut mettre en place cela
 
 
Dans mon exemple je vais faire en sorte d’avoir deux signatures pour accéder à un élément de la collection
-          Soit par l’index
-          Soit par le contactName
 Collection1.jpg
collection2.jpg
préparation
Ma classique classe contact
 public class Contact
    {
        private int _ContactID;
 
        public int ContactID
        {
            get { return _ContactID; }
            set { _ContactID = value; }
        }
 
        private string _ContactName;
 
        public string ContactName
        {
            get { return _ContactName; }
            set { _ContactName = value; }
        }
 
        private Nullable<int> _ContactAge;
 
        public Nullable<int> ContactAge
        {
            get { return _ContactAge; }
            set { _ContactAge = value; }
        }
 
        public Contact()
        { }
 
        public Contact(int contactID, string contactName, Nullable<int> contactAge)
        {
            this.ContactID = contactID;
            this.ContactName = contactName;
            this.ContactAge = contactAge;
        }
 
        public override string ToString()
        {
            return "ContactID = " + ContactID.ToString() + ",Contactname = " + ContactName + ",ContactAge = " + ContactAge.ToString() ;
        }
 
    }
 
 
I - avec une collection [.NET 1.0]
(je dérive ici ma collection de collectionBase pour ne pas avoir toutes les méthodes à réimplementer mais rien ne vous empeche bien sur de deriver de ICollection,…)
public class ContactCollection : CollectionBase
    {
        public Contact this[int index]
        {
            get
            {
                return (Contact) this.List[index];
            }
        }
 
        public Contact this[string contactName]
        {
            get
            {
                return this.Find(contactName);
            }
        }
 
 
        public void Add(Contact c)
        {
            this.List.Add(c);
        }
        private Contact Find(string contactName)
        {
            foreach (Contact c in this)
                if (c.ContactName == contactName)
                    return c;
 
            return null;
        }   
    }
 
II - avec une liste générique [.NET 2.0]
 
 public class ContactCollection : List<Contact>
    {
        public Contact this[string contactName]
        {
            get
            {
                return this.Find(delegate(Contact c)
                {
                    return c.ContactName == contactName;
                });
            }
        }
    }
 
 
Exemples d’utilisations
Code de la form principale
       ContactCollection Contacts = new ContactCollection();
 
        private void Form1_Load(object sender, EventArgs e)
        {
            Contacts.Add(new Contact(1, "Romagny", 31));
            Contacts.Add(new Contact(2, "Bellin",25));
            Contacts.Add(new Contact(3, "Durand", 50));
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Contacts["Romagny"].ToString());
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            MessageBox.Show(Contacts[2].ToString());
        }
 

Un dernier point les properties à la compilation sont converties en méthode (comme on peut le constater avec Reflector) : 
exemple ici avec la classe héritant de CollectionBase
       public Contact get_Item(string contactName)
        {
            return this.Find(contactName);
        }
        public Contact get_Item(int index)
        {
            return (Contact)base.List[index];
        }
 
get.jpg

Partager cet article

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

commentaires