2010-06-13 23 views
5

Tôi muốn biết cách sử dụng một số System.Collections.Hashtable trong F #. Lý do nó là một Hashtable là bởi vì tôi đang tham khảo C# hội đồng.Làm cách nào để bạn sử dụng (lấy giá trị từ khóa, thêm mục) Hàm băm trong F #

Làm cách nào để gọi các phương pháp sau? - Thêm - Nhận giá trị từ khóa

Tôi không thể tìm thấy bất kỳ điều gì hữu ích trong Google về điều này.

+0

Bạn có thể muốn xem xét sử dụng một từ điển chung, mang lại cho bạn loại an toàn cho các hashtable. Cách sử dụng cũng giống như được mô tả trong các câu trả lời hiện tại. Ngoài ra, có một loại bản đồ tích hợp trong F #, nếu bạn muốn ở trong ngôn ngữ đó. –

Trả lời

11

Khi đánh dấu chỉ ra, bạn có thể làm việc với loại Hashtable trực tiếp từ F # (giống như với bất kỳ loại .NET nào khác). Cú pháp để truy cập các chỉ mục trong F # hơi khác một chút mặc dù:

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] 

Vì Hashtable không phải là chung chung, bạn có thể muốn đưa đối tượng trở lại chuỗi. Để làm điều đó, bạn có thể sử dụng toán tử nhìn xuống :?>, hoặc bạn có thể sử dụng từ khóa unbox và cung cấp một loại chú thích để xác định những loại nào bạn muốn để có được như là kết quả:

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

Nếu bạn có bất kỳ kiểm soát trên loại được sử dụng, sau đó tôi khuyên bạn nên sử dụng Dictionary<int, string> thay vì Hashtable. Điều này là hoàn toàn tương thích với C# và bạn sẽ tránh được sự cần thiết phải làm đúc. Nếu bạn đang trở về này kết quả là từ F #, bạn cũng có thể sử dụng tiêu chuẩn F # map và chỉ bị ném lên trời nó để IDictionary<_,_> trước khi đi qua nó để C#:

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

Bằng cách này, C# người dùng sẽ thấy một loại quen thuộc, nhưng bạn có thể viết mã theo kiểu chức năng thông thường.

+0

THanks, cú pháp upcast và. [""] Đã giúp tôi giải quyết nó. Bí quyết là lấy obj dict [] cho một dict Hashtable []. :) – Russell

+0

Không phải là:> toán tử upcast? http://msdn.microsoft.com/en-us/library/dd233220.aspx – Artefacto

+0

@Artefacto: Vâng, bạn nói đúng. Tôi sẽ sửa câu trả lời (hy vọng tôi sẽ nhớ cái nào là cái nào ...). –

2

Khá đơn giản để thực hiện.

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

Nếu bạn muốn gọi trực tiếp 'Item', thì cú pháp sẽ là 'ht.Item (1)'. Tuy nhiên, có thể truy cập trực tiếp các trình chỉ mục từ F # bằng cách sử dụng 'ht. [1]'. –

+0

Cảm ơn bạn đã sửa. Như bạn có thể nói, tôi chỉ mới bắt đầu với F #. –

+0

Không sao cả. Chào mừng và học F # vui vẻ! Ngôn ngữ đã thay đổi một chút trong quá trình hoàn thiện VS 2010 - có những lúc bạn phải sử dụng 'Item' một cách rõ ràng, vì vậy thông tin trên internet đôi khi có thể gây nhầm lẫn :-). –

Các vấn đề liên quan