2017-04-07 22 views
4

备注:这是一个自我记录,但如果您有任何其他建议,或者如果我犯了任何错误/错过了某些显而易见的内容,我将非常感谢您的帮助。在C#列表和F#列表之间转换

来源:

convert .NET generic List to F# list

What can I do to pass a list from C# to F#?

https://msdn.microsoft.com/en-us/library/4kf43ys3(v=vs.110).aspx?cs-save-lang=1&cs-lang=fsharp#code-snippet-1


我在F#和C#初学者,我想一个C#列表转换为F#名单,反之亦然。这样做的代码/命令根据代码的位置(使用C#或F#)而变化。

请参阅下面的答案。如果您有任何其他建议,请告诉我。谢谢。

+0

我认为将答案放在答案中并且不在问题本身中保留答案是适当的。 – naslund

+0

已注意。我在下面提出了我的答案。谢谢。 –

回答

5

里面一个C#文件,我可以使用ListModule.OfSeq.ToList(),像这样:

// Currently inside a C# document 
var CS_list = new List<int> {1,2,3}; 
var FS_list = ListModule.OfSeq(CS_List); // Microsoft.FSharp.Collections.ListModule 
var CS_converted_back = FS_List.ToList(); 

内的F#的文件,我可以使用Seq.toListResizeArray<_>,像这样:

// Currently inside an F# document 
let FS_list = [1;2;3] 
let CS_list = ResizeArray<int> FS_list // System.Collections.Generic.List 
let FS_converted_back = Seq.toList CS_list 

如果我犯了什么错误,或者如果我错过了一些明显的事情,请告诉我。

+1

您可以使用'Seq.toList'或'List.ofSeq'。问题是你为什么要转换为'Seq'模块几乎与'List'模块具有相同的功能。 –

+1

@DavidRaab,对于模式匹配,列表的效果更好,但总的来说,我同意,在使用其他.net语言时,只需使用Seq。 – monoceres

+0

@monoceres是的,我认为它不重要。列表上的模式匹配对编写自己的低级递归函数很有用。你也可以用'List.head'和'List.tail'来写它们,而不是使用模式匹配。然后那些很好地转换为'Seq.head'和'Seq.tail'。但是在那种情况下,我想使用'seq {}'计算表达式更好。 –