2010-06-13 7 views
5

Me gustaría saber cómo usar un System.Collections.Hashtable en F #. La razón por la cual es una Hashtable es porque estoy haciendo referencia a conjuntos de C#.¿Cómo se usa (obtener valores de las teclas, agregar elementos) Hashtables en F #

¿Cómo llamaría a los siguientes métodos? - Agregar - Obtener el valor de la clave

No he podido encontrar nada útil en Google sobre esto.

+0

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. –

Respuesta

11

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.

+0

Gracias, la sintaxis upcast y. [""] Me ayudó a resolverlo. El truco estaba tomando el obj dict [] a un dict Hashtable []. :) – Russell

+0

No es:> el operador upcast? http://msdn.microsoft.com/en-us/library/dd233220.aspx – Artefacto

+0

@Artefacto: Sí, tienes razón. Corregiré la respuesta (con la esperanza de que eventualmente recordaré cuál es cuál ...). –

2

Es bastante sencillo de hacer.

open System.Collections //using System.Collections 

let ht = Hashtable() // var ht = new Hashtable() 

ht.Add(1, "One") 

let getValue = ht.Item[1] // var getValue = ht[1]; 
//NB: All indexer properties are named "Item" in F#. 
+4

Si quisiera llamar 'Item' directamente, entonces la sintaxis sería' ht.Item (1) '. Sin embargo, es posible acceder a los indexadores directamente desde F # usando 'ht. [1]'. –

+0

Gracias por la corrección. Como puedes ver, acabo de comenzar con F #. –

+0

No hay problema. ¡Bienvenido y diviértete aprendiendo F #! El lenguaje ha estado cambiando bastante durante la finalización de VS 2010; hubo momentos en los que tuvo que usar 'Item' explícitamente, por lo que la información en Internet a veces puede ser confusa :-). –

Cuestiones relacionadas