Ne dîtes rien, je vous entends déjà dire : « Oh non, pas encore lui avec son Steve Ballmer qui sera là demain à Paris ! Y en a marre d’entendre la même musique !!!« . Et vous avez raison ! Rassurez-vous, ce n’est pas cette histoire qui va nous empêcher de parler des opérateurs Linq et plus particulièrement des opérateurs Last & LastOrDefault.

Vu que c’est le début de la semaine, je vais faire un petit rappel sur notre fameuse classe MembreDeveloppez qui depuis le temps a continuer d’évoluer :

public class MembreDeveloppez : IComparable<MembreDeveloppez>
{
        // …
        public string Nom { get; set; }
        public int NombreMessages { get; set; }
        public int CompareTo(MembreDeveloppez other)
        {
                return this.NombreMessages.CompareTo(other.NombreMessages);
        }
}

Vous allez voir que ce nous allons aborder est assez similaire à deux opérateurs que nous avons déjà vu précédemment.

Nous avons toujours une liste d’instances de la classe MembreDeveloppez et dîtes-moi comment vous feriez pour récupérer le dernier élément de cette liste ? En sachant qu’il est y a au moins un élément dans cette liste.

Un Exemple :

SampleLibrary.MembreDeveloppez membre = membres[membres.Count – 1];

Vous allez voir que ce nous allons aborder est assez similaire à deux opérateurs que nous avons déjà vu précédemment.

Nous avons toujours une liste d’instances de la classe MembreDeveloppez et dîtes-moi comment vous feriez pour récupérer le dernier élément de cette liste ? En sachant qu’il est y a au moins un élément dans cette liste.

Un Exemple :

SampleLibrary.MembreDeveloppez membre = membres[membres.Count – 1];

Avec l’opérateur Last, vous allez pouvoir obtenir le même résultat :

SampleLibrary.MembreDeveloppez membre1 = membres.Last();

A la limite un peu moins de lettres à écrire mais on a déjà vu mieux comme évolution. Par contre, comment feriez-vous pour récupérer dans notre liste le dernier membre de Developpez.com qui a écrit au moins 3000 messages ?

Un cas possible :

SampleLibrary.MembreDeveloppez membre = null;
foreach (var currentMembre in membres)
{
        if (currentMembre.NombreMessages >= 3000)
        {
                membre = currentMembre;
        }
}
Console.WriteLine(« {0} est le dernier membre de notre liste qui a écrit au moins 3000 messages. », membre.Nom);

Avec l’opérateur Last, on va pouvoir le faire en une seule ligne de code !

SampleLibrary.MembreDeveloppez membre2 = membres.Last(membre => membre.NombreMessages >= 3000);

Personnellement, c’est le style d’écriture que j’adore : claire et concise.

Enfin, on va voir une dernière chose car pour rappel, il nous reste encore à illustrer l’utilisation de l’opérateur LastOrDefault. Si on change la contrainte de départ en considérant que notre liste pourrait être vide. Ou bien que la condition ne renvoie aucun résultat. Avec Last, on recevra une exception mais avec LastOrDefault, on récupérera la valeur nulle.

SampleLibrary.MembreDeveloppez membre3 = membres.LastOrDefault(membre => membre.NombreMessages > 100000);

C’est tout pour aujourd’hui !