L'idée n'est pas de faire un cours sur l'instruction yield, pour cela voir les liens suivants :
http://msdn.microsoft.com/fr-fr/library/9k7k7cf0.aspx
http://romainverdier.developpez.com/articles/dotnet/le-mot-cle-yield-et-les-iterateurs-en-csharp/
Mais de donner un petit plus quand on code avec des listes et très souvent on refait la même chose à savoir récupérer la sélection d'une liste pour lui appliquer un traitement particulier.
Donc le but du jeu est ; Comment peut-on faire pour éviter la duplication des Foreach ou While ou autre afin de récupérer une sélection d’éléments ?
Pour être le plus souple possible, je propose d’utiliser une méthode, nommé Cast, qui soit le plus générique possible.
// Méthode qui permet d'extraire les objets d'une collection. // Valable à partir de Framework .NET 2.0 // On peut mettre cette méthode dans une classe d’aide(Helper) // de facon à l'appeler ailleur pour tout objet qui contient // une collection IEnumerable (listBox,) IEnumerable<T> Cast<T>(IEnumerable items) { foreach (object item in items) yield return (T)item; }
Dans l’exemple suivant, j’utilise une class nommé Personne comme type avec deux propriétés, à savoir : Nom et Prenom. L’utilisation d’un objet string ou autre est possible aussi (voir l’exemple dans le code complet).
Voila le code dans sa totalité.
Merci Éric pour tes idées :
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Collections; using System.Windows.Forms; namespace Yield_SelectedItems { public partial class Form1 : Form { public Form1() { InitializeComponent(); List<Personne> personnes = new List<Personne>(); personnes.Add(new Personne("Hugo", "Victor")); personnes.Add(new Personne("Zola", "Emile")); personnes.Add(new Personne("Dupont", "Thomas")); personnes.Add(new Personne("Dupond", "Daniel")); personnes.Add(new Personne("Super Dupond", "Daniel")); listBox1.Items.Clear(); listBox1.Items.AddRange(personnes.ToArray()); } private void button1_Click(object sender, EventArgs e) { // Récupérer que les objets sélectionnés List<Personne> maSelections = new List<Personne>(Cast<Personne>(listBox1.SelectedItems)); // On créer un objet list de type (chaine de caractère) pour générer // avec la méthode Join un saut de ligne facilement, sans avoir à // gérer le premier ou le dernier retour chariot de trop. List<string> s = new List<string>(); foreach (Personne onePersonne in maSelections) { s.Add(string.Format("{0} {1}", onePersonne.Prenom, onePersonne.Nom)); } String nomPrenom = string.Join("\r", s.ToArray()); // On affiche le résultat. System.Windows.Forms.MessageBox.Show(nomPrenom); // Démo avec une list de string ListBox mesProduits = new ListBox(); mesProduits.SelectionMode = SelectionMode.MultiExtended; mesProduits.Items.Clear(); // J'alimente ma listbox List<string> listProduits = new List<string>(); listProduits.Add("Produit A"); listProduits.Add("Produit B"); listProduits.Add("Produit C"); listProduits.Add("Produit D"); listProduits.Add("Produit E"); mesProduits.Items.Clear(); mesProduits.Items.AddRange(listProduits.ToArray()); // Je sinule une sélection mesProduits.SelectedItems.Add(listProduits[0]); mesProduits.SelectedItems.Add(listProduits[3]); // On récupère les produits sélectionnés List<string> monChoix = new List<string>(Cast<string>(mesProduits.SelectedItems)); // On les affiches. System.Windows.Forms.MessageBox.Show(string.Join("\r", monChoix.ToArray())); // Lol, plus simple. Comme quoi des fois... Personne[] essai2 = new Personne[listBox1.SelectedItems.Count * 2]; // Je double la taille pour tester le mode Append listBox1.SelectedItems.CopyTo(essai2, 0); listBox1.SelectedItems.CopyTo(essai2, 3); // Append mode List<string> s2 = new List<string>(); foreach (Personne onePersonne in essai2) { s2.Add(string.Format("{0} {1}", onePersonne.Prenom, onePersonne.Nom)); } // On les affiches. System.Windows.Forms.MessageBox.Show(string.Join("\r", s2.ToArray())); // Lol, plus simple. Comme quoi des fois... string[] essai3 = new string[mesProduits.SelectedItems.Count]; mesProduits.SelectedItems.CopyTo(essai3, 0); List<string> soluce3 = new List<string>(essai3); // On les affiches. System.Windows.Forms.MessageBox.Show(string.Join("\r", soluce3.ToArray())); } // Méthode qui permet d'extraire les objets d'une collection. // Valable à partir de Framework .NET 2.0 // On peut mettre cette méthode dans une classe d’aide(Helper) // de facon à l'appeler ailleur pour tout objet qui contient // une collection IEnumerable (listBox,) IEnumerable<T> Cast<T>(IEnumerable items) { foreach (object item in items) yield return (T)item; } } class Personne { private string _nom; private string _prenom; public Personne() { } public Personne(string nom, string prenom) { Nom = nom; Prenom = prenom; } public string Nom { get { return _nom; } set { _nom = value; } } public string Prenom { get { return _prenom; } set { _prenom = value; } } // l'override de la méthode string est utilisé pour populer le listbox. public override string ToString() { return string.Format("{0} {1}", Nom, Prenom); } } }
Aucun commentaire:
Enregistrer un commentaire