F# 如何在F中使用(从键获取值、添加项)哈希表#

F# 如何在F中使用(从键获取值、添加项)哈希表#,f#,hashtable,F#,Hashtable,我想知道如何在F#中使用System.Collections.Hashtable。它之所以是哈希表,是因为我引用的是C#程序集 我将如何调用以下方法? -加 -从键获取值 我在谷歌上找不到任何有用的东西 这很简单 open System.Collections //using System.Collections let ht = Hashtable() // var ht = new Hashtable() ht.Add(1, "One") let getValue = ht.Item[

我想知道如何在F#中使用
System.Collections.Hashtable
。它之所以是哈希表,是因为我引用的是C#程序集

我将如何调用以下方法? -加 -从键获取值


我在谷歌上找不到任何有用的东西

这很简单

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

正如Mark所指出的,您可以直接从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] 
由于哈希表不是泛型的,所以您可能希望将对象转换回字符串。为此,您可以使用
:?>
向下播放运算符,也可以使用
unbox
关键字并提供类型注释,以指定要作为结果获取的类型:

let s = (sObj :?> string)
let (s:string) = unbox sObj
如果您可以控制所使用的类型,那么我建议您使用
Dictionary
而不是
Hashtable
。这与C#完全兼容,因此您无需进行铸造。如果您从F#返回此结果,您也可以使用标准的F#
map
,并在将其传递给C#之前将其上溯到
IDictionary

let map=map.empty |>map.add 1“一”
让res=map:>IDictionary

这样,C#用户将看到一个熟悉的类型,但您可以用通常的函数式编写代码。

如果您想直接调用
Item
,那么语法将是
ht.Item(1)
。但是,可以使用
ht.[1]
直接从F#访问索引器。感谢您的更正。正如你所知道的,我只是从F开始。没问题。欢迎来到这里,享受学习F#的乐趣!在VS 2010的定稿过程中,语言发生了很大的变化-有时你必须明确地使用
,因此互联网上的信息有时会令人困惑:-)。谢谢大家,如果.Net集合能够以与本机F#集合相同的方式访问,那就太好了。也许你可以,但我还不够熟练。谢谢,上抛和。[”“]语法帮助我解决了这个问题。诀窍是将obj dict[]转换为哈希表dict[]。:)不是:>向上投射操作符吗@是的,你是对的。我会更正答案(希望我会记得哪一个是……)。你可能想考虑使用一个通用字典,它为你的哈希表提供了类型安全性。用法与当前答案中描述的一样。此外,如果您想留在语言中,F#中还有一个内置的映射类型。
let map = Map.empty |> Map.add 1 "one"
let res = map :> IDictionary<_, _>