Как отмечает Марк, вы можете работать с типом Hashtable
непосредственно из F # (как и с любым другим типом .NET).Синтаксис для доступа к индексаторам в F # немного отличается:
open System.Collections
// 'new' is optional, but I would use it here
let ht = new Hashtable()
// Adding element can be done using the C#-like syntax
ht.Add(1, "One")
// To call the indexer, you would use similar syntax as in C#
// with the exception that there needst to be a '.' (dot)
let sObj = ht.[1]
Поскольку Hashtable не является универсальным, вы, вероятно, захотите привести объект обратно к строке.Для этого вы можете использовать оператор :?>
downcast или ключевое слово unbox
и указать аннотацию типа, чтобы указать, какой тип вы хотите получить в результате:
let s = (sObj :?> string)
let (s:string) = unbox sObj
Если у вас есть какой-либо контроль над тем, какой тип используется, то я бы рекомендовал использовать Dictionary<int, string>
вместо Hashtable
.Это полностью совместимо с C #, и вы избежите необходимости делать кастинг.Если вы возвращаете это в результате F #, вы также можете использовать стандартный F # map
и просто увеличить его до IDictionary<_,_>
, прежде чем передать его в C #:
let map = Map.empty |> Map.add 1 "one"
let res = map :> IDictionary<_, _>
Таким образом, пользователи C #увидеть знакомый тип, но вы можете написать код в обычном функциональном стиле.