Code de la Form principale
public ContactCollection oContacts; private void Form1_Load(object sender, EventArgs e) { oContacts = new ContactCollection(); oContacts.Add(new Contact(1, "Dupond", "Julien", "jdupond@hotmail.fr")); oContacts.Add(new Contact(2, "Martin", "Pierre", "pmartin@hotmail.fr")); oContacts.Add(new Contact(3, "Bellin", "Marie", "mb3@yahoo.fr")); oContacts.Add(new Contact(4, "Durand", "Paul", "durand1006@voila.fr")); oContacts.Add(new Contact(5, "Suisse", "André", "andre05@voila.fr")); }
Le prédicat employé tout au long des exemples:
private bool StartWith(Contact oContact) { bool bResult = false; if (oContact.Name.StartsWith("D")) { bResult = true; } else { bResult = false; } return bResult; }
La classe collection ContactCollection (j'mploie ici une classe Collection héritant de System.Collections.Generic.List, mais on peut employer une liste de la même manière)
using System; using System.Collections.Generic; using System.Text; namespace EtudeCollectionsGeneriques { public class ContactCollection : System.Collections.Generic.List<Contact> { } }
La classe Contact
using System; using System.Collections.Generic; using System.Text; namespace EtudeCollectionsGeneriques { public class Contact : IComparable<Contact> { private int _ID; private string _Name; private string _FirstName; private string _Email; public Contact() { } public Contact(int ID, string Name, string FirstName, string Email) { this.ID = ID; this.Name = Name; this.FirstName = FirstName; this.Email = Email; } public int ID { get { return _ID; } set { _ID = value; } } public string Name { get { return _Name; } set { _Name = value; } } public string FirstName { get { return _FirstName; } set { _FirstName = value; } } public string Email { get { return _Email; } set { _Email = value; } } public override string ToString() { return this.ID.ToString() + " " + this.Name + " " + this.FirstName + " " + this.Email; } public class ContactNameComparer : System.Collections.Generic.IComparer<Contact> { public SorterMode SorterMode; public ContactNameComparer() { } public ContactNameComparer(SorterMode SorterMode) { this.SorterMode = SorterMode; } #region IComparer<Contact> Membres int System.Collections.Generic.IComparer<Contact>.Compare(Contact x, Contact y) { if (SorterMode == SorterMode.Ascending) { return y.Name.CompareTo(x.Name); } else { return x.Name.CompareTo(y.Name); } } #endregion } #region IComparable<Contact> Membres public int CompareTo(Contact other) { return this.ID.CompareTo(other.ID); } #endregion } }
Permet d'ajouter un élément à la collection
// 1 on crée un objet Contact oContact; oContact=new Contact(9,"Leneuf","Jean-pierre","neuf9@hotmail.com"); // 2 on ajoute l objet à la collection oContacts.Add(oContact);
Variante :
// 1 on crée un objet Contact oContact; oContact=new Contact();// oContact.ID = 9; oContact.Name = "Leneuf"; oContact.FirstName = "Jean-pierre"; oContact.Email = "neuf9@hotmail.com"); // 2 on ajoute l objet à la collection oContacts.Add(oContact);
Ou encore plus rapide :
oContacts = new ContactCollection(); oContacts.Add(new Contact(1, "Dupond", "Julien", "jdupond@hotmail.fr")); oContacts.Add(new Contact(2, "Martin", "Pierre", "pmartin@hotmail.fr"));
// insérer un element à l index spécifié oContacts.Insert(2, new Contact(8, "Perrot", "Alphonse", "aperrot@hotmail.fr"));
Permet d ajouter une collection (de même type) à la collection
// 1 on crée une collection ContactCollection oRangeContacts; oRangeContacts = new ContactCollection(); oRangeContacts.Add(new Contact(6, "Cossin", "Luc", "cossinluc@laposte.net")); oRangeContacts.Add(new Contact(7, "Mars", "Julie", "mars13@hotmail.fr")); // 2 on ajoute la collection à la collection oContacts.AddRange(oRangeContacts);
ContactCollection oRangeContacts; oRangeContacts = new ContactCollection(); oRangeContacts.Add(new Contact(6, "Cossin", "Luc", "cossinluc@laposte.net")); oRangeContacts.Add(new Contact(7, "Mars", "Julie", "mars13@hotmail.fr")); // On insère à la position 2 les nouveaux éléments oContacts.InsertRange(2, oRangeContacts);
Modifier un élément de la collection.
Il faut :
1 - trouver / déterminer l'élément à modifier (avec les méthodes Find(),FindLast(),etc.)
2 - appliquer les modifications à l'élément
Soit en accédant à l élément directement
Contact oContact = oContacts.Find(StartWith); oContact.Name = "Gaston";
Soit en passant par l'index de la collection
oContacts[2].Name = "Gaston";
1 - déterminer l'élément à supprimer
2 - faire appel à la méthode Remove() de la collection en passant cet élément
oContacts.Remove(oContacts.FindLast(StartWith));
Pour supprimer l élément à l index de la collection spécifié
oContacts.RemoveAt(1);
Supprimer tous les éléments de la collection en respectant un prédicat
oContacts.RemoveAll(StartWith);
Supprimer des éléments de la collection sur une plage
// supprime 3 contacts à partir de l index 2 de la collection de contacts oContacts.RemoveRange(2, 3);
Supprimer tous les éléments de la collection
oContacts.Clear();
foreach (Contact oContact in oContacts) { } for (int nCount = 0; nCount <= oContacts.Count - 1; nCount++) { }
string smessage = string.Empty; IEnumerator<Contact> oContactsEnumerator = oContacts.GetEnumerator(); while (oContactsEnumerator.MoveNext()) { smessage += oContactsEnumerator.Current.ToString() + Environment.NewLine; }
string smessage=string.Empty; oContacts.ForEach(delegate(Contact oContact) { smessage += oContact.ToString() + Environment.NewLine; } MessageBox.Show(smessage);
Pour obtenir la collection mais ne pouvant être que consultée
//AsReadOnly() retourne la collection mais en lecture seule (ici l'édition dans le datagridview sera impossible) dataGridView1.DataSource = oContacts.AsReadOnly();
Pour extraire des éléments de la collection
// extrait à partir de la position 2 de la collection, 3 éléments (contact) List<Contact> oRangeContacts = oContacts.GetRange(2, 3);
Trouver un élément respectant un prédicat (si plusieurs éléments correspondent au prédicat c'est le premier qui respecte celui-ci qui est renvoyé)
Contact oContact = oContacts.Find(StartWith); MessageBox.Show(oContact.ToString());
Trouver l'index d'un élément.
Contact oContact = oContacts.FindLast(StartWith); int nIndex = oContacts.IndexOf(oContact);
Renvoie l'index (int) de la position du premier élément respectant un prédicat.
MessageBox.Show(oContacts.FindIndex(StartWith).ToString());
Trouver le dernier élément respectant un prédicat.
MessageBox.Show(oContacts.FindLast(StartWith).ToString());
Trouver l'index du dernier élément de la collection respectant un prédicat
Contact oContact = oContacts.FindLast(StartWith); int nIndex = oContacts.LastIndexOf(oContact);
Renvoie l'index (int) du dernier élément de la collection respectant un prédicat
MessageBox.Show(oContacts.FindLastIndex(StartWith).ToString());
Trouver tous les éléments (FindAll() retourne une liste générique) respectant un prédicat
dataGridView1.DataSource = oContacts.FindAll(StartWith);
1 - Avec l'interface IComparable implémentée par la classe Contact
oContacts.Sort();
2 - Avec l'interface IComparer implémentée par la classe ContactNameComparer (classe imbriquée dans la classe Contact)
oContacts.Sort(new Contact.ContactNameComparer(SorterMode.Ascending));
Si vous ne connaissez pas bien comment trier avec IComparable et IComparer vous pouvez regarder cet article: http://romagny13.over-blog.com/article-6254481.html
Ou encore regarder cette source ;)
http://codes-sources.commentcamarche.net/source/34515-utilisation-de-icomparer
Copier vers un tableau la collection
Contact[] ContactArrray; ContactArrray = new Contact[5]; oContacts.CopyTo(ContactArrray); dataGridView1.DataSource = ContactArrray;
Convertir en tableau la collection
Contact[] ContactArrray = oContacts.ToArray();
Convertir la collection vers un autre type
Exemple :
Je vais convertir ma liste de contacts vers une liste de personnes
List<Person> ListPerson = oContacts.ConvertAll(new Converter<Contact, Person>(ConvertToPerson)); dataGridView1.DataSource = ListPerson;
La méthode appelée pour effectuer la conversion :
public Person ConvertToPerson(Contact oContact) { return new Person(oContact.ID, oContact.Name, oContact.FirstName, oContact.Email); }
La classe Person
public class Person { private int _ID; private string _Name; private string _FirstName; private string _Email; public Person() { } public Person(int ID, string Name, string FirstName, string Email) { this.ID = ID; this.Name = Name; this.FirstName = FirstName; this.Email = Email; } public int ID { get { return _ID; } set { _ID = value; } } public string Name { get { return _Name; } set { _Name = value; } } public string FirstName { get { return _FirstName; } set { _FirstName = value; } } public string Email { get { return _Email; } set { _Email = value; } } }
Savoir si la collection contient un élément
Contact oContact = oContacts.Find(StartWith); MessageBox.Show(oContacts.Contains(oContact).ToString());
Renvoie un Bool indiquant si au moins un element de la collection respecte le prédicat
MessageBox.Show(oContacts.Exists(StartWith).ToString());
Renvoie un bool indiquant si tous les éléments de la collection respecte un prédicat
MessageBox.Show(oContacts.TrueForAll(StartWith).ToString());
Compare 2 éléments et renvoie un bool
MessageBox.Show(oContacts[1].Equals(oContact).ToString());
Renvoie le type de la collection
MessageBox.Show(oContacts.GetType().ToString());
Méthode permettant inverser les éléments de la collection
oContacts.Reverse();
MessageBox.Show("Nombre de contacts dans la collection : " + oContacts.Count.ToString());
MessageBox.Show(oContacts.Capacity.ToString());
Library (System.Collections.Generic.List): http://msdn.microsoft.com/fr-fr/library/d9hw1as6(VS.80).aspx
Le centre de development C#: http://msdn.microsoft.com/en-us/vstudio/hh341490.aspx
Un coach C# (comme il existe pour VB.NET,ASP.ET et VSTS) a vu le jour : http://msdn.microsoft.com/fr-fr/vstudio/bb409645(fr-fr)