从 C# 代码内部访问 F# 列表

Posted

技术标签:

【中文标题】从 C# 代码内部访问 F# 列表【英文标题】:Accessing an F# list from inside C# code 【发布时间】: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;

我怎样才能做到这一点?

【问题讨论】:

【参考方案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# 进行渲染

以上是关于从 C# 代码内部访问 F# 列表的主要内容,如果未能解决你的问题,请参考以下文章

如何从非托管 C++ 代码获取结构化列表值到 C#?

从 JavaScript 访问 C# 列表

从 C# 调用 F# 代码

2018整合C#面试题

使用 C# 从选择列表中获取内部文本值

C#实现迭代器