Как Вы используете (получите значения от ключей, добавьте объекты), Хеш-таблицы в F#

Я хотел бы знать, как использовать a System.Collections.Hashtable в F#. Причина это - Хеш-таблица, состоит в том, потому что я ссылаюсь на блоки C#.

Как я назвал бы следующие методы? - Добавляют - Получают значение от ключа

Я не смог найти что-либо полезным в Google об этом.

5
задан Linger 30 September 2012 в 22:20
поделиться

2 ответа

Как указывает Марк, вы можете работать с типом 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 # увидят знакомый тип, но вы можете написать код в обычном функциональном стиле.

11
ответ дан 18 December 2019 в 14:42
поделиться

Это довольно просто сделать.

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#.
2
ответ дан 18 December 2019 в 14:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: