2010-07-16 5 views
8

Je suis juste commençant par F # et je veux itérer sur un dictionnaire, d'obtenir les clés et les valeurs.F # itération sur un dictionnaire

Donc, en C#, je mettrais:

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

Je ne peux pas sembler trouver une façon de le faire en F # (pas celui qui compile de toute façon).

Quelqu'un pourrait suggérer s'il vous plaît le code équivalent en F #?

Cheers,

Crush

Répondre

2
resultSet |> Map.iter (fun key value -> 
    printf "Key = %A, Value = %A\n" key value) 
+0

curieux - pour quelque raison que ce printf avec un \ n à la fin de la chaîne plutôt que printfn? –

+0

Je pose la question inverse chaque fois que je vois 'printfn'. Pas de raison, bien sûr, juste une préférence personnelle. –

18

Quel est le type de votre dictionnaire?

Si elle est IDictionary non-générique que l'extrait de code l'indique, essayez ce qui suit (en F #, for ne pas insérer implicitement les conversions, vous devez donc ajouter Seq.cast<> pour obtenir une collection typée que vous pouvez facilement travailler avec):

for entry in dict |> Seq.cast<DictionaryEntry> do 
    // use 'entry.Value' and 'entry.Key' here 

Si vous utilisez IDictionary<'K, 'V> générique vous n'avez pas besoin de l'appel à Seq.cast (si vous avez le contrôle de la bibliothèque, ce qui est mieux que l'option précédente):

for entry in dict do 
    // use 'entry.Value' and 'entry.Key' here 

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

for KeyValue(k, v) in dict do 
    // 'k' is the key, 'v' is the value 

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

+0

Bon appel avec la boucle pour les méthodes * (fonction?) * Avec effets de bord. – ChaosPandion

+3

Mais le point entier de 'iter' est d'effectuer des effets secondaires aussi bien (comme en témoigne son type), il est aussi « conçu à cet effet » ... (ce qui ne veut pas dire que' for' est inférieure, bien sûr, en fait, je ne savais rien sur 'KeyValue'). –

+0

@Pavel: Oui, 'iter' est également conçu à cet effet. Cependant, j'ai l'impression que 'iter' est hérité de OCaml et que la méthode F # consiste à utiliser' for' (c'est probablement une préférence personnelle). Généralement, je pense que les constructions de langage sont préférables aux fonctions de bibliothèque si vous faites quelque chose où la construction de la langue est appropriée. –

Questions connexes