我目前正在开发一个使用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>
这三种方法之间有任何实际区别吗?
如果你查看F#库源代码,你会发现它们都是一样的:
Seq.ofList
只是调用 List.ofSeq
, 在这里"list.fs"文件中可以看到
List.toSeq
实现了使用 s :> seq<_>
, 在这里"seq.fs"文件中可以看到
在可读性方面,特别是如果代码是一个较大的F# pipeline的一部分时,我可能会使用Seq.ofList
或List.toSeq
,因为这使代码更加优美:
someInput
|> List.map (fun x -> whatever)
|> List.toSeq
Seq.ofList
或List.toSeq
时,你需要问自己“我的代码在使用什么?” 如果(就像这个例子一样)你有一个列表,并想要生成一个seq/IEnumerable供其他代码使用,那么请使用List.toSeq
。如果你收到了一个列表,并想要获取一个seq以供自己的代码使用,请使用Seq.ofList
。换句话说,选择最符合数据流在代码特定部分的“方向”的功能。 - rmunnFSharp.Core.Fluent
,那么你就可以像这样对列表进行操作:[1;2;3].toSeq()
。 - s952163