Como Mark señala, se puede trabajar con el tipo Hashtable
directamente de F # (al igual que con cualquier otro tipo de .NET). La sintaxis para acceder a los indicadores a F # es ligeramente diferente, sin embargo:
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]
Desde Hashtable no es genérica, es probable que desee enviar el objeto de nuevo a cadena. Para ello, puede utilizar el :?>
operador abatido, o puede utilizar la palabra clave unbox
y proporcionar una anotación de tipo para especificar qué tipo usted quiere obtener como resultado:
let s = (sObj :?> string)
let (s:string) = unbox sObj
Si usted tiene ningún control sobre qué tipo se utiliza, entonces recomendaría usar Dictionary<int, string>
en lugar de Hashtable
. Esto es totalmente compatible con C# y evitaría la necesidad de hacer casting. Si usted está volviendo esto como resultado de F #, también se puede utilizar norma F # map
y justo upcast a IDictionary<_,_>
antes de pasarlo a C#:
let map = Map.empty |> Map.add 1 "one"
let res = map :> IDictionary<_, _>
De esta manera, C# los usuarios verán un tipo familiar, pero puedes escribir el código en el estilo funcional habitual.
Es posible que desee considerar el uso de un diccionario genérico, que le da seguridad de tipo para la tabla hash. El uso es tal como se describe en las respuestas actuales. Además, hay un tipo de mapa incorporado en F #, si desea permanecer dentro del idioma. –