簡體   English   中英

從傳遞給 C# 的 F# 列表中檢索項目

[英]Retrieving items from an F# List passed to C#

I have a function in C# that is being called in F#, passing its parameters in a Microsoft.FSharp.Collections.List<object> .

如何從 C# function 中的 F# 列表中獲取項目?

編輯

我找到了一種“功能”風格的方式來遍歷它們,並且可以將它們傳遞給 function,如下所示返回 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;
 }

再次編輯

F# List,如下文所指出的,是可枚舉的,所以上面的 function 可以換行;

new List<LiteralType>(parameters);

但是,有什么方法可以按索引引用 F# 列表中的項目?

通常,避免將 F# 特定類型(如 F# 'list' 類型)暴露給其他語言,因為體驗並不是那么好(如您所見)。

F# 列表是一個 IEnumerable,因此您可以很容易地從中創建一個 System.Collections.Generic.List。

沒有有效的索引,因為它是一個單鏈表,因此訪問任意元素是 O(n)。 如果您確實需要該索引,最好更改為另一種數據結構。

在我的 C# 項目中,我創建了擴展方法來輕松轉換 C# 和 F# 之間的列表:

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);
   }
}

然后像這樣使用:

var lst = new List<int> { 1, 2, 3 }.ToFSharplist();

回答已編輯的問題:

但是,有什么方法可以按索引引用 F# 列表中的項目?

我更喜歡 f# 而不是 c# 所以這里是答案:

let public GetListElementAt i = mylist.[i]

返回一個元素(也適用於您的 C# 代碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM