Nous voila pour le second billet sur les opérateurs Linq et pour aujourd’hui, j’aimerais aborder deux opérateurs qui se ressemblent fort : First & FirstOrDefault. Pour l’occasion, j’en ai profité pour créer une solution Visual Studio 2008 qui sera mise à jour après chaque billet. Vous retrouverez le zip de la solution en fin d’article.

On va reprendre notre « classe » MembreDeveloppez que j’ai un peu étoffé pour l’occasion :

public class MembreDeveloppez
{
        public string Nom { get; set; }
        public int NombreMessages { get; set; }
}

Et toujours sur le même principe qu’avant, on va considérer que nous avons une liste d’instances de la classe MembreDeveloppez (donc <ListMembreDeveloppez>).

Alors maintenant, dîtes-moi comment vous feriez pour récupérer le premier élément de cette liste en sachant qu’il y a au moins un élément dedans ?

MembreDeveloppez membre1 = membres[0];

Vous avez pensé à ça ? Pas mal. Personnellement, je fais comme ceci avec l’opérateur First de Linq :

MembreDeveloppez membre1 = membres.First();

Impressionnant, n’est-ce pas ?! Non ??? Admettons, un point pour vous, on peut dire que cet opérateur n’apporte pas grand chose dans notre cas. Cependant, je me demande bien comment vous faîtes pour récupérer le premier objet dans la liste qui a un nombre de message supérieur à 2000 ?

Pour la majorité d’entre vous, vous feriez comme ceci ?

foreach (MembreDeveloppez membre in membres)
{
        if (membre.NombreMessages > 2000)
        {
                // Trouvé !
        }
}

Dans ce cas-ci et toujours avec l’opérateur First, une ligne de code !

MembreDeveloppez membre1 = membres.First(membre => membre.NombreMessages > 2000);

Aaaahhh, c’est mieux quand même ! Et si on corsait légèrement l’énoncé en disant qu’il est possible que notre liste n’ait aucun élément. Pour vous, on va dire que ça ne change rien mais dans le cas de l’opérateur First, on risque de recevoir une exception si notre liste est vide ou bien si la condition n’est pas respectée. C’est là que l’opérateur FirstOrDefault va s’avérer utile car dans le cas où notre demande ne renvoie rien, on ne recevra pas une exception comme avec First mais tout simplement null.

MembreDeveloppez membre2 = membres.FirstOrDefault(membre => membre.NombreMessages > 100000);