F#列表转换为C# IEnumerable:最有效的方法?

13

我目前正在开发一个使用C#编写GUI的F#库,我想问一下将一个F#(通用)列表传递给C#代码(通用IEnumerable)的最佳或正确方法是什么。

到目前为止,我已经找到了三种方法:

[1; 2; 3; 4; 5;] |> List.toSeq

[1; 2; 3; 4; 5;] |> Seq.ofList 

[1; 2; 3; 4; 5;] :> seq<int>

这三种方法之间有任何实际区别吗?

1个回答

17

如果你查看F#库源代码,你会发现它们都是一样的:

  • Seq.ofList 只是调用 List.ofSeq, 在这里"list.fs"文件中可以看到

  • List.toSeq 实现了使用 s :> seq<_>, 在这里"seq.fs"文件中可以看到

在可读性方面,特别是如果代码是一个较大的F# pipeline的一部分时,我可能会使用Seq.ofListList.toSeq,因为这使代码更加优美:

someInput
|> List.map (fun x -> whatever) 
|> List.toSeq

5
稍微扩展一下Tomas出色的答案:我的一般建议是,当你在考虑使用Seq.ofListList.toSeq时,你需要问自己“我的代码在使用什么?” 如果(就像这个例子一样)你有一个列表,并想要生成一个seq/IEnumerable供其他代码使用,那么请使用List.toSeq。如果你收到了一个列表,并想要获取一个seq以供自己的代码使用,请使用Seq.ofList。换句话说,选择最符合数据流在代码特定部分的“方向”的功能。 - rmunn
2
如果你使用NuGet安装了FSharp.Core.Fluent,那么你就可以像这样对列表进行操作:[1;2;3].toSeq() - s952163

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接