代码之家  ›  专栏  ›  技术社区  ›  johnc

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

  •  9
  • johnc  · 技术社区  · 15 年前

    我在C中有一个函数,它在F中被调用,在 Microsoft.FSharp.Collections.List<object> .

    我如何才能从C函数中的F列表中获取项目?

    编辑

    我找到了一种“功能性”风格的方法来循环它们,并可以将它们传递给下面的函数以返回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 回复  |  直到 14 年前
        1
  •  11
  •   Brian    15 年前

    一般来说,避免将特定于f的类型(如f“list”类型)暴露给其他语言,因为这种体验并不是那么好(如您所见)。

    f列表是一个IEnumerable,因此您可以很容易地从中创建System.Collections.Generic.List。

    没有有效的索引,因为它是一个单独链接的列表,所以访问任意元素是O(N)。如果您真的想要这个索引,那么更改到另一个数据结构是最好的。

        2
  •  7
  •   Tuomas Hietanen    15 年前

    在我的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();
    
        3
  •  1
  •   Tuomas Hietanen    14 年前

    已编辑问题的答案:

    但是,是否有任何方法可以按索引引用F列表中的项目?

    我更喜欢F而不是C,所以下面是答案:

    let public GetListElementAt i = mylist.[i]
    

    返回一个元素(也用于C代码)。