【问题标题】:Accessing an F# list from inside C# code从 C# 代码内部访问 F# 列表
【发布时间】:2012-01-04 23:10:25
【问题描述】:

我写了一个 F# 模块,里面有一个列表:

module MyModule
type X = 
    {
        valuex : float32
    }
let l = [ for i in 1 .. 10 -> {valuex =  3.3f}]

现在我试图从一个 C# 类访问之前定义的列表,但我不知道如何转换它:

... list = MyModule.l ; //here's my problem

我需要类似的东西:

IList<X> list = MyModule.l;

我怎样才能做到这一点?

【问题讨论】:

    标签: c# list types f#


    【解决方案1】:

    就这么简单:

    IList<MyModule.X> list = MyModule.l.ToList();
    

    您需要转换方法而不是强制转换/隐式转换的原因是因为 FSharpList&lt;T&gt; 实现了 IEnumerable&lt;T&gt; 而不是 IList&lt;T&gt;,因为它表示不可变的链表。

    请注意,您必须在 C# 项目中包含 FSharp.Core 作为引用。

    【讨论】:

      【解决方案2】:

      FSharpList&lt;T&gt;(这是 F# list&lt;T&gt; 类型的 .Net 名称)没有实现 IList&lt;T&gt;,因为它没有意义。

      IList&lt;T&gt; 用于访问和修改可以通过索引访问的集合,list&lt;T&gt; 不是。要从 C# 中使用它,您可以显式使用类型:

      FSharpList<MyModule.X> l = MyModule.l;
      var l = MyModule.l; // the same as above
      

      或者你可以使用它实现IEnumerable&lt;T&gt;的事实:

      IEnumerable<MyModule.X> l = MyModule.l;
      

      或者,如果您确实需要 IList&lt;T&gt;,您可以使用 LINQ 的 ToList(),正如 Ani 建议的那样:

      IList<MyModule.X> l = MyModule.l.ToList();
      

      但是你必须记住 F# 列表是不可变的,所以没有办法修改它。

      【讨论】:

      • 是的,谢谢你的建议。我知道不可变,但我不需要修改列表。只需检索其中的一些值即可使用 XNA 和 C# 进行渲染
      猜你喜欢
      • 2012-01-21
      • 2012-01-05
      • 2011-03-24
      • 2010-10-03
      • 2014-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多