Я хотел бы знать, как использовать a System.Collections.Hashtable
в F#. Причина это - Хеш-таблица, состоит в том, потому что я ссылаюсь на блоки C#.
Как я назвал бы следующие методы? - Добавляют - Получают значение от ключа
Я не смог найти что-либо полезным в Google об этом.
Как указывает Марк, вы можете работать с типом 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 не является универсальным, вы, вероятно, захотите преобразовать объект обратно в строку. Для этого вы можете либо использовать оператор понижающего преобразования :?>
, либо использовать ключевое слово unbox
и предоставить аннотацию типа, чтобы указать, какой тип вы хотите получить в качестве результат:
let s = (sObj :?> string)
let (s:string) = unbox sObj
Если у вас есть контроль над используемым типом, я бы рекомендовал использовать Dictionary
вместо Hashtable
. Это полностью совместимо с C #, и вам не придется выполнять приведение типов. Если вы возвращаете это как результат из F #, вы также можете использовать стандартную карту F #
и просто преобразовать ее в IDictionary <_, _>
перед передачей в C #:
let map = Map.empty |> Map.add 1 "one"
let res = map :> IDictionary<_, _>
Таким образом, пользователи 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#.