从 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<T>
实现了 IEnumerable<T>
而不是 IList<T>
,因为它表示不可变的链表。
请注意,您必须在 C# 项目中包含 FSharp.Core
作为引用。
【讨论】:
【参考方案2】:FSharpList<T>
(这是 F# list<T>
类型的 .Net 名称)没有实现 IList<T>
,因为它没有意义。
IList<T>
用于访问和修改可以通过索引访问的集合,list<T>
不是。要从 C# 中使用它,您可以显式使用类型:
FSharpList<MyModule.X> l = MyModule.l;
var l = MyModule.l; // the same as above
或者你可以使用它实现IEnumerable<T>
的事实:
IEnumerable<MyModule.X> l = MyModule.l;
或者,如果您确实需要 IList<T>
,您可以使用 LINQ 的 ToList()
,正如 Ani 建议的那样:
IList<MyModule.X> l = MyModule.l.ToList();
但是你必须记住 F# 列表是不可变的,所以没有办法修改它。
【讨论】:
是的,谢谢你的建议。我知道不可变,但我不需要修改列表。只需检索其中的一些值即可使用 XNA 和 C# 进行渲染以上是关于从 C# 代码内部访问 F# 列表的主要内容,如果未能解决你的问题,请参考以下文章