2009-03-19 45 views
9

Tôi có một hàm trong C# đang được gọi là F #, đi qua các thông số của nó trong một Microsoft.FSharp.Collections.List<object>.mục Lấy từ F # Danh sách truyền cho C#

Làm thế nào tôi có thể nhận được các mục từ F # List trong C# chức năng?

EDIT

Tôi đã tìm thấy một phong cách cách 'chức năng' để lặp qua chúng, và có thể vượt qua chúng vào một chức năng như bên cạnh để quay C# System.Collection.List:

private static List<object> GetParams(Microsoft.FSharp.Collections.List<object> inparams) 
{ 
    List<object> parameters = new List<object>(); 
    while (inparams != null) 
    { 
     parameters.Add(inparams.Head); 
     inparams = inparams.Tail; 
    } 
    return inparams; 
} 

EDIT AGAIN

Danh sách F #, như được chỉ ra bên dưới, là Có thể đếm được, vì vậy hàm trên có thể được thay thế bằng dòng;

new List<LiteralType>(parameters); 

Có cách nào để tham chiếu một mục trong danh sách F # theo chỉ mục không?

Trả lời

11

Nói chung, tránh phơi bày F # loại cụ thể (như F # 'danh sách' loại) sang các ngôn ngữ khác, bởi vì kinh nghiệm không phải là tất cả những gì tuyệt vời (như bạn có thể nhìn thấy).

Một chiếc F # danh sách là một IEnumerable, vì vậy bạn có thể tạo ra ví dụ một System.Collections.Generic.List từ nó theo cách đó khá dễ dàng.

Không có chỉ mục hiệu quả, vì nó là một đơn lẻ-danh sách liên kết và do đó truy cập vào một yếu tố độc đoán là O (n). Nếu bạn muốn lập chỉ mục đó, việc thay đổi cấu trúc dữ liệu khác là tốt nhất.

+2

Xin chào! Mỗi danh sách có mục đích của nó ... http://blogs.msdn.com/chrsmith/archive/2008/07/10/mastering-f-lists.aspx Bạn có thể chuyển đổi F # danh sách để IEnumerable như thế này: mylist |> Danh sách. toSeq –

7

Trong tôi C# -project tôi đã thực hiện phương pháp khuyến nông để chuyển đổi danh sách giữa C# và F # dễ dàng:

using System; 
using System.Collections.Generic; 
using Microsoft.FSharp.Collections; 
public static class FSharpInteropExtensions { 
    public static FSharpList<TItemType> ToFSharplist<TItemType>(this IEnumerable<TItemType> myList) 
    { 
     return Microsoft.FSharp.Collections.ListModule.of_seq<TItemType>(myList); 
    } 

    public static IEnumerable<TItemType> ToEnumerable<TItemType>(this FSharpList<TItemType> fList) 
    { 
     return Microsoft.FSharp.Collections.SeqModule.of_list<TItemType>(fList); 
    } 
} 

Sau đó sử dụng giống như:

1

trả lời cho câu hỏi đã chỉnh sửa:

Có cách nào, tuy nhiên, để tham chiếu một mục trong danh sách F # theo chỉ mục?

tôi thích f # trên C# vì vậy đây là câu trả lời:

let public GetListElementAt i = mylist.[i] 

trả về một phần tử (cũng cho mã # C).

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