从传递给C#的F#列表中检索项目

9

我有一个在C#中的函数,被F#调用并使用Microsoft.FSharp.Collections.List<object>作为其参数。

我该如何在C#函数中获取F# List中的项目?

编辑

我已经找到了一种'函数式'的方法来遍历它们,并可以将它们作为下面所示传递给一个函数以返回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#列表是可枚举的,因此上面的函数可以被替换为以下一行代码:

new List<LiteralType>(parameters);

然而,有没有办法通过索引在 F# 列表中引用一个项目呢?

3个回答

12

通常情况下,避免向其他语言暴露F#特定类型(例如F# 'list'类型),因为体验并不是很好(正如您所见)。

F#列表是一个IEnumerable,因此您可以轻松地通过这种方式从中创建System.Collections.Generic.List。

由于它是一个单向链表,因此没有有效的索引,因此访问任意元素的时间复杂度为O(n)。如果您确实需要索引,请更改为另一种数据结构。


2
嗨!每个列表都有其目的... http://blogs.msdn.com/chrsmith/archive/2008/07/10/mastering-f-lists.aspx 您可以像这样将F#列表转换为IEnumerable:mylist |> List.toSeq - Tuomas Hietanen

7

在我的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();

1

回答编辑后的问题:

有没有办法通过索引引用 F# 列表中的项?

我更喜欢 F# 而不是 C#,所以这里是答案:

let public GetListElementAt i = mylist.[i]

返回一个元素(也适用于您的 C# 代码)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接