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

时间:2009-03-19 04:49:07

标签: c# .net f#

我在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#List是Enumerable,所以上面的函数可以替换为该行;

new List<LiteralType>(parameters);

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

3 个答案:

答案 0 :(得分:11)

一般情况下,避免将F#特定类型(如F#'列表'类型)暴露给其他语言,因为体验并不是那么好(如您所见)。

F#列表是IEnumerable,因此您可以创建例如一个System.Collections.Generic.List非常容易。

没有有效的索引,因为它是单链接列表,因此访问任意元素是O(n)。如果您确实需要索引,则最好更改为其他数据结构。

答案 1 :(得分: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();

答案 2 :(得分:1)

回答编辑过的问题:

  

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

我更喜欢f#而不是c#所以答案就是这样:

let public GetListElementAt i = mylist.[i]

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