你如何使用(从键中获取值,添加项目)F#中的哈希表

时间:2010-06-13 12:59:09

标签: f# hashtable

我想知道如何在F#中使用System.Collections.Hashtable。它是Hashtable的原因是因为我引用了C#程序集。

我如何调用以下方法?   - 添加   - 从密钥中获取价值

我无法在Google中找到任何有用的内容。

2 个答案:

答案 0 :(得分:11)

正如Mark指出的那样,您可以直接使用F#中的Hashtable类型(就像使用任何其他.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不是通用的,您可能希望将对象强制转换为字符串。为此,您可以使用:?>向下转换运算符,也可以使用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#用户会看到一个熟悉的类型,但你可以用通常的功能样式编写代码。

答案 1 :(得分:2)

这很简单。

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