Конвертировать карту F # в Hashtable - PullRequest
1 голос
/ 06 июля 2010

Мне нужно преобразовать класс карты F # в System.Collections.Hashtable для использования в C #.

Этот вопрос отличается от следующего: Как вы используете (получить значения изключи, добавить элементы) Хеш-таблицы в F #

В этом вопросе задавался вопрос, как вернуть значения из хеш-таблицы.Я хочу построить карту F # и затем преобразовать ее в System.Collections.Hashtable.

Как мне это сделать?

Большое спасибо.

Вот что я попробовал (не компилирует):

#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) ) 

Редактировать : Спасибо за ваши ответы.Вот что я решил использовать:

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

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

Ответы [ 3 ]

5 голосов
/ 06 июля 2010

Если бы я писал это, я бы предпочел цикл for вместо функции более высокого порядка iter. Вы все равно пишете императивный код (для работы с императивными объектами), и я не думаю, что использование iter делает его «более функциональным». F # также поддерживает императивное программирование, поэтому мы можем использовать эти императивные функции в этом случае:

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

Я обычно предпочитаю iter функцию только тогда, когда мне не нужно писать явную лямбда-функцию в качестве второго параметра. Например, если будет работать следующее:

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

Если у вас есть некоторый контроль над кодом C #, вы также можете рассмотреть возможность использования IDictionary<'K, 'V> в C # вместо Hashtable. В этом случае вы можете легко передать F # Map<'K, 'V> в результате, потому что map реализует интерфейс IDictionary<'K, 'V> (именно для обеспечения плавного использования из C #).

5 голосов
/ 06 июля 2010

Этот код компилируется.

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

let myHash = Hashtable()

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

Оригинальный не компилируется, потому что тип dict [(1, "one"); (2, "two")] равен IDictionary<int, string>, а не Map И семейство функций Map. * Требуется для работы с типом F # Map.

4 голосов
/ 06 июля 2010

вы можете использовать активный шаблон KeyValuePair

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