14 votes

F# itération sur un Dictionnaire

Je débute tout juste avec F# et je veux itérer sur un dictionnaire, en récupérant les clés et les valeurs.

Donc en C#, je mettrais :

IDictionary resultSet = test.GetResults;
foreach (DictionaryEntry de in resultSet)
{
    Console.WriteLine("Clé = {0}, Valeur = {1}", de.Key, de.Value);
}

Je ne semble pas trouver de moyen de faire cela en F# (en tout cas pas un qui compile).

Est-ce que quelqu'un pourrait suggérer le code équivalent en F#?

Amicalement,

Crush

22voto

Tomas Petricek Points 118959

Quel est le type de votre dictionnaire?

S'il s'agit d'un IDictionary non générique comme votre extrait de code le suggère, essayez ce qui suit (En F#, le for n'insère pas implicitement de conversions, donc vous devez ajouter Seq.cast<> pour obtenir une collection typée avec laquelle vous pouvez facilement travailler) :

for entry in dict |> Seq.cast do
  // utilisez 'entry.Value' et 'entry.Key' ici

Si vous utilisez un IDictionary<'K, 'V> générique alors vous n'avez pas besoin d'appeler Seq.cast (si vous avez un contrôle sur la bibliothèque, c'est mieux que l'option précédente) :

for entry in dict do
  // utilisez 'entry.Value' et 'entry.Key' ici

Si vous utilisez le type F# immuable Map<'K, 'V> (qui est le meilleur type à utiliser si vous écrivez du code fonctionnel en F#) alors vous pouvez utiliser la solution de Pavel ou vous pouvez utiliser une boucle for avec le motif actif KeyValue comme ceci :

for KeyValue(k, v) in dict do
  // 'k' est la clé, 'v' est la valeur

Dans les deux cas, vous pouvez utiliser soit for soit diverses fonctions iter. Si vous avez besoin d'effectuer quelque chose avec des effets secondaires alors je préférerais une boucle for (et ce n'est pas la première réponse où je mentionne cela :-)), car c'est une construction de langage conçue à cet effet. Pour un traitement fonctionnel vous pouvez utiliser diverses fonctions comme Seq.filter etc..

5voto

Pavel Minaev Points 60647
resultSet |> Map.iter (fun key value ->
   printf "Clé = %A, Valeur = %A\n" key value)

0voto

knocte Points 4320

(Ceci est une réponse plus courte que celle de Tomas, allant droit au but.) Les dictionnaires sont mutables, en F# il est plus naturel d'utiliser des Maps (immuables). Donc si vous travaillez avec map: Map, itérez à travers de cette manière :

for KeyValue(key,value) in map do
    DoStuff key value

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X