Déconstruction et dictionnaires avec C# 7.0

Les dictionnaires sont une structure de données bien pratique dans certaines situations, mais j'ai toujours trouvé qu'ils nuisaient un peu à la lisibilité du code.

Dans l'exemple suivant, dans la boucle on ne sait pas exactement ce que représente la clé et la valeur. Bien évidemment le code ici est très court donc on le comprend assez facilement mais sur du code réel, ça n'est pas toujours évident.

var dimensions = new Dictionary<string, double>
{
    { "Largeur", 0.7 },
    { "Longueur", 1.0 }
};
foreach (KeyValuePair<string, double> pair in dimensions)
    Console.WriteLine($"{pair.Key} = {pair.Value}");

Dans ce cas de figure, j'utilise habituellement deux variables pour obtenir des noms plus explicites :

var dimensions = new Dictionary<string, double>
{
    { "Largeur", 0.7 },
    { "Longueur", 1.0 }
};
foreach (KeyValuePair<string, double> pair in dimensions)
{
    string dimensionName = pair.Key;
    double dimensionValue = pair.Value;
    Console.WriteLine($"{dimensionName} = {dimensionValue}");
}

Avec C# 7, on a une nouveauté nommée déconstruction (Deconstruction en anglais) qui peut aider un peu. On peut écrire une méthode générique qui renvoie un Tuple, ce qui permet de retourner plusieurs valeurs au lieu d'une seule :

static (T1, T2) Deconstruct<T1, T2>(KeyValuePair<T1, T2> pair)
{
  return (pair.Key, pair.Value);
}

Notez que pour que ça fonctionne dans Visual Studio 2017, il faut installer le package NuGet System.ValueTuple.

Avec l'aide de Linq, on peut ensuite réécrire la boucle comme ceci :

var dimensions = new Dictionary<string, double>
{
    { "Largeur", 0.7 },
    { "Longueur", 1.0 }
};
foreach ((string dimensionName, double dimensionValue) in dimensions.Select(Deconstruct))
  Console.WriteLine($"{dimensionName} = {dimensionValue}");

Etiquettes:

Add new comment