utilisation de l’instruction lambda c# 3

utilisation de l’instruction lambda en  c#
par Ettougourti Mohamed Ali

Notre étude de l’utilisation de l’expression lambda dans le c sharp se poursuit.

Poussés par une curiosité que les nécessités de  programmation justifient nous pouvons nous demander si le vecteur objet de notre attention comporte une seule et unique valeur qui se perpétue tout au long du vecteur aussi long et aussi volumineux soit-il.

L’expression lambda nous est là aussi d’un bon secours puisque nous pouvons utiliser l’interrogation « All » pour savoir si toutes les valeurs d’un vecteur sont identiques.

L’instruction « all » renvoie une valeur de type booléen « oui » ou « non » , «  true » ou « false » , vrai ou faux.

Ainsi pour revenir à notre vecteur k de type int initié dans le précédent article nous pouvons l’interroger pour voir si toutes les valeurs du vecteur sont égales à zéro.

int[] k = { 2, 1, 2, 3, 5, 3, 4, 1, 6, 7, 8, 2, 1, 0, 8 };

bool vrai =  k.All (b => b == 0);

l’instruction nous renvoie faux. Ce qui est vrai puisque certaines valeurs du vecteur k sont différentes de 0.

On peut poser la question d’une autre façon et voir si toutes les valeurs sont supérieures à 0.

vrai = k.All(b => b > 0);

la réponse est toujours négative puisque nous savons d’un simple coup d’œil au vecteur k qu’une valeur au moins est égale à zéro.

Excédés nous voulons en finir en posant directement et franchement la question : existe-t-il une seule valeur dans le vecteur qui soit égale à zéro ?

C’est l’instruction Any qui vient à notre secours, satisfait notre curiosité

vrai = k.Any (b => b == 0);

cette fois « vrai » est bien vraie  et la réponse est positive.

D’aucuns proposeraient de se rassurer de l’existence d’une valeur égale à zéro dans notre vecteur k on se prenant autrement mais toujours en recourant aux services précieux de notre expression lambda.

Il est vrai que le c sharp nous offre pour les vecteurs ou les tableaux une autre instruction qui semble à priori remplir les mêmes taches.

L’instruction « first », puisque c’est d’elle dont il s’agit, nous permettrait de vérifier l’existence d’une valeur dans un vecteur.

int[] k = { 2, 1, 2, 3, 5, 3, 4, 1, 6, 7, 8, 2, 1, 0, 8 };

int occ = k.First (b=> b == 3);

s’Il est vrai que l’instruction first employant l’expression lambda nous confirme dans notre intuition de l’existence d’une valeur égale à 3 appartenant au vecteur l’instruction se contente toutefois de renvoyer tout bêtement la valeur recherchée.

En inspectant la variable « occ » on « découvre » sans surprise qu’elle est égale à 3. Ce que nous savons déjà. Merci quand même.

L’instruction « first » semble donc inutile d’autant plus qu’en vérifiant on découvre que l’instruction a vraiment un très mauvais caractère. A vous d’en juger.

Si jamais vous demandez à l’aide de l’instruction first à chercher une valeur qui n’existe pas dans le vecteur prenons par exemple le chiffre 9 le compilateur proteste énergiquement.

le programme se plante avec une exception soulevée « sequence contains no matching element ».

Bon d’accord mais il aurait pu le dire gentiment.

Vous l’avez compris pour utiliser la fonction « first » il faut être sûr que la valeur existe sinon gare aux foudres du compilateur.

L’astuce serait donc d’utiliser l’instruction « Any » pour être sûr de l’existence de la valeur dont on recherche l’occurrence.              Une fois rassuré on fait appel à l’instruction first.

Int pos=0 ;

if (k.Any (b=>b==9))

{

pos = k.First (b => b == 9);

} else pos=-1 ;

Si au contraire vous êtes dans votre droit en cherchant un chiffre qui appartient au vecteur exemple :

if ( k.Any (b=>b==7))

{

pos = k.First (b => b == 7);

} else pos=-1 ;

Dans ce cas la fonction retourne le chiffre 7 pour nous informer que la valeur 7 existe bel et bien, c’est ce que nous savons déjà grâce à l’instruction any.

La fonction first semble donc tout à fait inappropriée pour une utilisation avec l’expression lambda.

D’ailleurs l’exemple officiel donné de l’utilisation de la fonction first n’emploie pas l’expression lambda.

First n’a en fait d’autres prétentions que de retourner le premier élément du tableau.

int[] k = { 2, 1, 2, 3, 5, 3, 4, 1, 6, 7, 8, 2, 1, 0, 8 };

int q= k.First();

q prend la valeur de 2 qui est effectivement la première valeur du vecteur k. Autant utiliser notre ancienne bonne méthode

int q= k[0] ;

Pour chercher la première occurrence d’une valeur dans un vecteur il est plus utile de passer par le casting « tolist ».

int pos = k.ToList().IndexOf(7);

pos prend la valeur 9 qui est effectivement le rang de la valeur 7.

Par contre si vous cherchez la valeur 8 qui est un doublon occupant à la fois les rangs 10 et 14 la ligne de programme

pos = k.ToList().IndexOf(8);

Renvoie   la valeur 10. C’est-à-dire la première occurrence de la valeur recherchée.

Vous l’avez remarqué la fonction indexof n’emploie pas l’expression lambda. Si vous vous obstinez à le faire l’erreur soulevée est similaire à celle soulevée lors de l’utilisation de l’expression lambda avec la fonction reverse.

l’avantage avec ‘indexof contrairement à first c’est que l’instruction ne se met pas dans tous ses états si la valeur recherchée n’existe pas elle se contente gentiment de retourner la valeur -1.

pos = k.ToList().IndexOf(9);

(16)