On entame le milieu de la semaine et pour se motiver un peu plus, rien de tel qu’un second billet sur les opérateurs Linq et en plus, ça ne va pas être compliqué. L’opérateur de ce billet est Concat !

Imaginez que vous avez deux listes et que vous désirez n’en faire qu’une seule qui regrouperait les éléments de la première liste avec les éléments de la seconde liste : comment procéderiez-vous ?

Le facile est surement d’utiliser la méthode AddRange disponible sur une liste, ainsi vous avez surement pensez à quelque chose de ce genre :

List<SampleLibrary.MembreDeveloppez> listeMembres1 = SampleLibrary.MembreDeveloppez.GetMembresDeveloppez();
List<SampleLibrary.MembreDeveloppez> listeMembres2 = SampleLibrary.MembreDeveloppez.GetMembresDeveloppez();

List<SampleLibrary.MembreDeveloppez> listeMembreResult = new List<SampleLibrary.MembreDeveloppez>();

listeMembreResult.AddRange(listeMembres1);
listeMembreResult.AddRange(listeMembres2);

Grâce à la méthode Concat de Linq, vous allez pouvoir concaténer deux listes d’objets pour n’en faire qu’une seule. Je dis liste mais ça fonctionnerait avec n’importe quelle collection/séquence tant qu’elle implémente IEnumerable ou IEnumerable<T>.

List<SampleLibrary.MembreDeveloppez> listeMembres1 = SampleLibrary.MembreDeveloppez.GetMembresDeveloppez();
List<SampleLibrary.MembreDeveloppez> listeMembres2 = SampleLibrary.MembreDeveloppez.GetMembresDeveloppez();

var query = listeMembres1.Concat(listeMembres2);

List<SampleLibrary.MembreDeveloppez> listeMembresResult1 = query.ToList();

Comme vous pouvez le remarquer, j’ai utilisé l’opérateur ToList (que nous avons déjà vu lors d’un autre billet) après l’opérateur Concat pour obtenir mes objets dans une liste. La raison est que l’opérateur Concat renvoie un IEnumerable<T>. En fait pour être plus précis, on récupère un ConcatIterator<T>.

image

 

 

 

L’opérateur Concat ne crée donc pas directement une séquence avec le bon résultat mais va tout simplement s’occuper de mémoriser les séquences à concaténer et ce n’est qu’à la demande que le résultat sera exécuté (par exemple lors d’un foreach ou comme dans notre cas lors de l’utilisation de l’opérateur ToList. On appelle ça l’exécution différée.

Pour le prouver, on va modifier légèrement le code pour ajouter un nouvel élément dans listeMembre1 après avoir créé la requête de concaténation.

List<SampleLibrary.MembreDeveloppez> listeMembres1 = SampleLibrary.MembreDeveloppez.GetMembresDeveloppez();
List<SampleLibrary.MembreDeveloppez> listeMembres2 = SampleLibrary.MembreDeveloppez.GetMembresDeveloppez();

var query = listeMembres1.Concat(listeMembres2);

List<SampleLibrary.MembreDeveloppez> listeMembresResult1 = query.ToList();

listeMembres1.Add(new SampleLibrary.MembreDeveloppez() { Nom = « Marc Lussac », NombreMessages = 23000 });

List<SampleLibrary.MembreDeveloppez> listeMembresResult2 = query.ToList();

Si vous essayez ce code, vous vous apercevrez que listeMembresResult2 contient un élément de plus que listeMembresResult1.

Je pense que pour un opérateur dit facile, on est allé assez dans le détail.

Rendez-vous au prochain numéro !

 

Téléchargez les sources (sous Visual Studio 2008).