2010-06-13 20 views
5

F # içinde System.Collections.Hashtable'in nasıl kullanılacağını bilmek isterim. Hashtable'ın nedeni, C# derlemelerine başvurmak olduğudur.Nasıl kullanılır (tuşlardan değerler alın, öğeler ekleyin)

Aşağıdaki yöntemleri nasıl arardım? - ekle -

anahtarından değer elde et Bu konuda Google'da yararlı bir şey bulamadık.

+0

Yazarken-güvenlik Hashtable için veren bir jenerik Sözlük kullanmayı düşünün isteyebilirsiniz. Kullanım, mevcut cevaplarda açıklandığı gibidir. Ayrıca, dil içinde kalmak istiyorsanız F # içinde yerleşik bir harita türü vardır. –

cevap

11

Mark işaret ettiği gibi, sen (tıpkı diğer NET türüyle gibi) F # doğrudan Hashtable türü ile çalışabilir. F # dizinleyiciler erişmek için sözdizimi olsa biraz farklıdır: Hashtable yana

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] 

jenerik değil, muhtemelen dizeye geri nesne artığını isteyeyim. Bunu yapmak için, :?> mahzun operatörünü kullanabilirsiniz veya takvimi unbox anahtar kelimeyi kullanın ve sonuç olarak elde etmek istiyoruz ne tür belirtmek için bir tür ek açıklaması sağlayabilir:

let s = (sObj :?> string) 
let (s:string) = unbox sObj 

Eğer herhangi bir kontrole sahip olursa Hangi tür kullanıldığında, Hashtable yerine Dictionary<int, string> kullanmanızı öneririm. Bu C# ile tamamen uyumludur ve döküm yapmaktan kaçınmanız gerekir. F # bir sonucu olarak bu dönen ediyorsanız, ayrıca C# geçirmeden önce sadece upcast o IDictionary<_,_> standart F # map ve kullanabilirsiniz:

let map = Map.empty |> Map.add 1 "one" 
let res = map :> IDictionary<_, _> 

Bu şekilde, C#, kullanıcıların tanıdık bir türü görürler ancak kodu normal fonksiyonel tarzda yazabilirsiniz.

+0

THanks, upcast ve. [""] Sözdizimi bunu çözmeme yardımcı oldu. Buradaki hile [] bir Hashtable dict []. :) – Russell

+0

Değil mi:> upcast operatörü? http://msdn.microsoft.com/en-us/library/dd233220.aspx – Artefacto

+0

@Artefacto: Evet, haklısınız. Cevabı düzeltirim (umarım hangisi olduğunu hatırlayacağım umarım ...). –

2

Bunu yapmak oldukça basit.

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

doğrudan 'Item' aramak istedim, o zaman sözdizimi olacaktır' ht.Item (1) '. Bununla birlikte, indeksleyicilere doğrudan F # ile [ht. [1] 'den erişmek mümkündür. –

+0

Düzeltme için teşekkürler. Anlatabileceğiniz gibi, sadece F # ile yeni başladım. –

+0

Sorun değil. Hoşgeldin ve F # öğrenmeyi eğlen! Dil, VS 2010'un son haline getirilmesi sırasında biraz değişiyordu - 'Öğeyi' açıkça kullanmanız gereken zamanlar vardı, bu yüzden internetteki bilgiler bazen kafa karıştırıcı olabilir :-). Net koleksiyonları yerli F # koleksiyonları aynı şekilde erişilebilir olması için –

İlgili konular