Archives par mot-clé : c# coding

Utilisation de l’expression lambda dans les opérations sur les vecteurs en c sharp

Utilisation de l’expression lambda dans les opérations sur les vecteurs en c sharp :

Par Ettougourti Mohamed Ali

Les opérations sur les vecteurs, ou tableaux, ou arrays en anglais, occupent la plus large part du temps consacré à l’exécution des programmes informatiques.
Dans le c# sharp ainsi que dans d’autres langages l’expression           « lambda » est utilisée pour « standardiser » certaines opérations sur les vecteurs.
Nous en donnons dans cet article des exemples basiques :
Nous commençons par créer un vecteur ou un tableau de valeurs de type double

double []x = new double [100];

System.Random t = new Random();

Pour créer des valeurs aléatoires nous avons initié un générateur de valeurs aléatoires « t » que nous allons utiliser pour remplir le tableau « x » de valeurs aléatoires.
Pour ce faire nous allons utiliser l’expression lambda illustrée par le signe « => »
x = x.Select(b => b = t.NextDouble()).ToArray();
cette simple ligne nous permet d’économiser toute une boucle de for, next ou de do while.
Exemple d’ancien code:
for(int i=0 ; i< x.Length;i++)

{

x [i] =  t.NextDouble();

}

L’expression lambda permet aussi d’effectuer certaines opérations basiques sur le vecteur.

Ainsi il nous est possible de calculer la somme des valeurs contenues dans le vecteur :

double sum = x.Sum();

ou encore d’en calculer la moyenne arithmétique:

double average = x.Average ();

La même expression lambda nous permet aussi de trouver la valeur maximale du vecteur:

double max = x.Max ();

ou encore la valeur minimale du vecteur:

double min = x.Min();

il nous est même possible en transformant le tableau en « List » de chercher et trouver la position dans le vecteur de la valeur « min » et de la valeur « max »:

int position = x.ToList().IndexOf(min);

position = x.ToList().IndexOf(max);

l’expression “lambda” permet aussi de gérer de façon élégante           et en masse la conversion des valeurs contenus dans le vecteur d’un type à un autre.

Nous pouvons ainsi facilement convertir les valeurs doubles contenues dans le vecteur « x » en valeurs de type « float » ou « int » ou « short »..

Nous pouvons calculer la somme des valeurs contenues dans le vecteur comme si elles étaient de type int16 en opérant la conversion et en effectuant l’addition grâce à l’expression lambda

int int_sum = x.Select(b => System.Convert.ToInt32(b)).Sum();
une ligne de code utilisant l’instruction “Cast” ne marchera pas générant une erreur de type « system invalid cast exception ».
int int_sum= x.Cast().Sum();
grâce à l’expression lambda des opérations arithmétiques plus poussées peuvent être opérées sur les valeurs du vecteur.
On peut par exemple élever les valeurs du vecteur à la puissance deux, en determiner la somme puis la diviser lpar le nombre des valeurs contenues dans le vecteur.
Toutes ces opérations tiendront en une seule ligne de code
double y= x.Select(b => b * b).Sum() / x.Length;

Autres utilisations de l’expression lambda font appel à des mots tels que « next » et « index ».
C’est le cas si l’on veut opérer une accumulation sur une séquence des valeurs contenues dans le vecteur en recourant à la fonction « aggregate ».
double yy = x.Aggregate((b, next) => next + b);
Lorsque vous lancez le programme vous remarqueriez que la variable « yy » est égale à  la variable « sum » et que nous n’avons rien fait de plus que de calculer la somme des valeurs d’une autre façon.
Mais la fonction aggregate peut retrouver toute son utilité en l’employant avec une une autre instruction  telle que « where » par exemple.
Il nous sera possible dés lors de calculer la somme de certaines valeurs choisies selon un critère bien précis.
Exemple de code:
double yy = x.Where (b=> b> 0.5).Aggregate ( (b, next) => next + b);
en vérifiant vous remarqueriez que seules les valeurs supérieures à 0.5 ont été prises en considération dans le calcul de la somme des valeurs.
Le mot « next »  n’est pas un mot clef il peut-être remplacé dans la ligne de code précédente par le mot « index » sans que les résultats changent.
double yy2 = x.Where(b => b > 0.5).Aggregate((b, index) => index + b);
En vérité le mot “next” ou “index” peuvent être tout aussi bien remplacés par tout autre mot par exemple « suivant », ou même « chat » sans protestation aucune du compilateur.

et voici le code source des  exemples donnés

 

private void samples ()
{
double []x = new double [100];

System.Random t = new Random();
x = x.Select(b => b = t.NextDouble()).ToArray();
double sum = x.Sum();
double average = x.Average();
double max = x.Max();
double min = x.Min();
int position = x.ToList().IndexOf(min);
position = x.ToList().IndexOf(max);

//instruction générant erreur 
//int int_sum= x.Cast<int>().Sum();

int int_sum = x.Select(b => System.Convert.ToInt32(b)).Sum();
double y= x.Select(b => b * b).Sum() / x.Length;

double yy1 = x.Where(b=> b> 0.5).Aggregate((b, next) => next + b);
double yy2 = x.Where(b => b > 0.5).Aggregate((b, suivant ) => suivant + b);
}

(46)