在 F# 中,将类型列表向上转换为 seq<_> 的最简单方法是什么?
In F#, what is the simplest method of upcasting a typed list to a seq<_>?
(新手问题)在 F# 中,将类型列表向上转换为 seq<_> 的最简单方法是什么?
我正在研究与 C# 的互操作并尝试学习 F#。我有一个明确定义的电影列表:
Movies: MovieInfo list option
我想向上转换为
ItemsSource: seq<obj> option
给定 Movies,我该如何转到 ItemsSource?
例如,电影 |> ??????
感谢您的帮助。
这里实际上有两个小任务:(1) 将列表转换为序列,这就是您询问的内容,以及 (2) 在 option
.[=20= 的“内部”进行]
将列表转换为序列很容易:Seq.ofList
。另外,如果您需要转换元素类型,请使用 Seq.cast
:
let movies: MovieInfo list = ...
let itemsSource = movies |> Seq.ofList |> Seq.cast
但这还不是全部:您没有裸名单 MovieInfo list
,而是在 option
- MovieInfo list option
中。一种将转换应用于选项内部值的方法是通过 Option.map
:
let x = Some 3
let y = x |> Option.map ((+) 2) // now, y = Some 5
所以结合以上所有内容:
let ItemsSource = Movies |> Option.map (Seq.ofList >> Seq.cast)
Seq.cast
的使用有创建新枚举的开销,它包装了原始的,请参阅 source。最好使用铸造
let movies : MovieInfo list = []
let moviesAsObj = movies :> seq<_> :?> seq<obj>
// and if it's inside `option`
let moviesOpt = Some movies
let moviesAsObjOpt = moviesOpt |> Option.map (fun m -> m :> seq<_> :?> obj)
灵感来自 here
(新手问题)在 F# 中,将类型列表向上转换为 seq<_> 的最简单方法是什么?
我正在研究与 C# 的互操作并尝试学习 F#。我有一个明确定义的电影列表:
Movies: MovieInfo list option
我想向上转换为
ItemsSource: seq<obj> option
给定 Movies,我该如何转到 ItemsSource?
例如,电影 |> ??????
感谢您的帮助。
这里实际上有两个小任务:(1) 将列表转换为序列,这就是您询问的内容,以及 (2) 在 option
.[=20= 的“内部”进行]
将列表转换为序列很容易:Seq.ofList
。另外,如果您需要转换元素类型,请使用 Seq.cast
:
let movies: MovieInfo list = ...
let itemsSource = movies |> Seq.ofList |> Seq.cast
但这还不是全部:您没有裸名单 MovieInfo list
,而是在 option
- MovieInfo list option
中。一种将转换应用于选项内部值的方法是通过 Option.map
:
let x = Some 3
let y = x |> Option.map ((+) 2) // now, y = Some 5
所以结合以上所有内容:
let ItemsSource = Movies |> Option.map (Seq.ofList >> Seq.cast)
Seq.cast
的使用有创建新枚举的开销,它包装了原始的,请参阅 source。最好使用铸造
let movies : MovieInfo list = []
let moviesAsObj = movies :> seq<_> :?> seq<obj>
// and if it's inside `option`
let moviesOpt = Some movies
let moviesAsObjOpt = moviesOpt |> Option.map (fun m -> m :> seq<_> :?> obj)
灵感来自 here