Envoyé par
François DORIN
Pas con et très astucieux !
Effectivement, c'est une vielle ruse que je n'avais pas utilisé depuis longtemps.
Je l'ai tapé de mémoire et tu as tout à fait raison sur la particularité du dictionnaire.
Petite rectification sur la dernière condition toutefois, il manque un zéro.
{ x => 5000 <= x && x < Double.MaxValue , () => Console.WriteLine("5000+") }
Envoyé par
Max
Très astucieux mais peut-être un peu too much dans ce contexte (la discussion a le tag [Débutant])
Effectivement, c'est un poil avancé pour un débutant, ça nécessite donc une explication.
Tout d'abord l'instruction est basé sur un dictionnaire (un couple clé-valeur dont la clé est unique mais pas forcément triée).
Ici, la clé et la valeur sont des délégués (en quelque sorte, des pointeurs vers des fonction).
Dans ce cas, la clé sera donc un pointeur vers une fonction prenant en paramètre un Double et renvoyant un Booléen.
Et la valeur sera un pointeur vers une fonction ne prenant pas de paramètre et ne retournant aucune valeur.
Le dictionnaire contient donc quatre pairs clé-valeur
Chaque clé est composé d'une expression lambda définissant le corps du premier délégué.
Comme le premier paramètre est un double, je l'ai appelé x, et comme le résultat est un booléen, seul le test logique (la comparaison du paramètre en entrée) est nécessaire.
Chaque valeur est composé d'une expression lambda définissant le corps du second délégué.
Puisque qu'il n'y a pas de paramètre en entrée, on place "()", puis le corps de l'action à réaliser (ici Console.WriteLine).
J'aurais pu déclarer les fonction une à une et écrire ceci, mais ça aurait été plus long et on aurait pas eu toutes les informations visibles d'un coup.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| class Program
{
static void Main(string[] args)
{
Double number = 2018;
var choices = new Dictionary<Func<Double, Boolean>, Action>
{
{ TestInf500, WriteInf500 },
{ TestBetwen500And1999, WriteBetween500And1999 },
{ TestBetwen2000And4999 , WriteBetween2000And4999},
{ TestSup5000 , WriteSup5000 }
};
choices.First(it => it.Key(number)).Value();
Console.ReadKey();
}
public static Boolean TestInf500(Double x)
{
return x < 500;
}
public static Boolean TestBetwen500And1999(Double x)
{
return 500 <= x && x < 2000;
}
public static Boolean TestBetwen2000And4999(Double x)
{
return 2000 <= x && x < 5000;
}
public static Boolean TestSup5000(Double x)
{
return 5000 <= x && x < Double.MaxValue;
}
public static void WriteInf500()
{
Console.WriteLine("0-499");
}
public static void WriteBetween500And1999()
{
Console.WriteLine("500-1999");
}
public static void WriteBetween2000And4999()
{
Console.WriteLine("2000-4999");
}
public static void WriteSup5000()
{
Console.WriteLine("5000+");
}
} |
La ligne "choices.First(it => it.Key(number)).Value()" est composé comme ceci :
choice.First est une méthode Linq recherchant la première clé-valeur répondant aux critères passés via l'expression lambda.
it => it.Key(number) est mon expression lambda, elle signifie que parmi les clé du dictionnaire, je dois rechercher le délégué dont le retour matchera.
Pour la valeur 2018, le premier (et le seul) délégué qui répond true est le troisième.
.Value() est appliqué sur la pair clé-valeur trouvé par First, et me permet de récupérer la valeur de cette pair et donc le délégué qui affiche l'information dans la console.
J'espère avoir été suffisamment clair.
Partager