Как вы используете (получить значения из ключей, добавить элементы) Hashtables в F # - PullRequest
5 голосов
/ 13 июня 2010

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

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

Мне не удалось найти в Google ничего полезного по этому поводу.

Ответы [ 2 ]

11 голосов
/ 13 июня 2010

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

2 голосов
/ 13 июня 2010

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

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#.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...