2010-07-06 3 views
1

J'ai besoin de convertir une classe F # map en System.Collections.Hashtable pour utilisation par C#.Convertir une mappe F # en Hashtable

Cette question n'est pas la même chose que ce qui suit: How do you use (get values from keys, add items) Hashtables in F#

Cette question a demandé comment retourner les valeurs d'une table de hachage. Je veux construire une carte F #, puis le convertir en System.Collections.Hashtable.

Comment faire?

Merci beaucoup.

Voici ce que j'ai essayé (ne compile pas):

#light 

open System 
open System.Collections 
open System.Collections.Generic 

let my_map = dict [(1, "one"); (2, "two")] 


let myHash = Hashtable() 
my_map |> Map.iter (fun k v -> myHash.Add(k, v)) 

Modifier: Merci pour vos réponses. Voici ce que j'ai décidé d'utiliser:

let my_map = Map [(1, "one"); (2, "two")] 

let myHash = Hashtable() 
my_map |> Map.iter (fun k v -> myHash.Add(k, v)) 

Répondre

5

Ce code est compilé.

let my_map = Map([(1, "one"); (2, "two")]) 

let myHash = Hashtable() 

my_map |> Map.iter (fun k v -> myHash.Add(k, v)) 

L'original ne compile pas parce que le type de dict [(1, "one"); (2, "two")] est IDictionary<int, string>, pas Map. Et la famille de fonctions Map. * Nécessite d'opérer sur le type de carte F #.

4

vous pouvez utiliser modèle actif KeyValuePair

my_map |> Seq.iter(fun (KeyValue (k,v)) -> myHash.Add(k, v)) 
5

Si j'écrivais, je préférerions probablement boucle for à la place de la fonction d'ordre supérieur iter. Vous écrivez de toute façon un code impératif (pour traiter des objets impératifs) et je ne pense pas que l'utilisation de iter le rende "plus fonctionnel". F # prend en charge la programmation impérative et, afin que nous puissions utiliser ces caractéristiques impératives dans ce cas:

fonction
let myHash = Hashtable() 
for (KeyValue(k, v)) in myMap do 
    myHash.Add(k, v) 

Je préfère habituellement iter seulement quand je ne ai pas besoin d'écrire fonction explicite lambda comme second paramètre. Par exemple, si les éléments suivants fonctionnerait:

myMap |> Seq.iter myHash.Add // This doesn't work, so I prefer 'for' instead 

Si vous avez un certain contrôle sur le code C#, vous pouvez aussi envisager simplement en utilisant IDictionary<'K, 'V> en C# au lieu de Hashtable. Dans ce cas, vous pouvez facilement passer F # Map<'K, 'V> comme résultat, car la carte implémente l'interface IDictionary<'K, 'V> (exactement pour permettre une utilisation en douceur à partir de C#).

Questions connexes