我有以下代码填充System.Collections.Generic.List我不喜欢它所以我想知道是否有更好的方法来做到这一点。
let getDirectories =
Directory.GetDirectories(_baseFolder)
let languagesList = new System.Collections.Generic.List<string>()
Seq.cast getDirectories
|> Seq.map(fun dir -> (new DirectoryInfo(dir)).Name)
|> fun range -> languagesList.AddRange(range)
答案 0 :(得分:17)
你试过了吗?
let list = new System.Collections.Generic.List<string>(arr)
List<'T>
有一个带IEnumerable<'T>
的构造函数,因此您可以愉快地将seq<'T>
传递给它。
答案 1 :(得分:6)
除了Mehrdad的回答
我发现为许多标准集合和.Net类型定义帮助程序模块有助于使它们更加友好。在这里,我将定义以下
module BclListUtil =
let ofArray (arr: 'T array) = new System.Collections.Generic.List<'T>(arr)
let ofSeq (arr: 'T seq) = new System.Collections.Generic.List<'T>(arr)
然后您可以将原始代码更改为以下
let getDirectories =
Directory.GetDirectories(_baseFolder)
let languagesList =
getDirectiories
|> Seq.map (fun dir -> (new DirectoryInfo(dir)).Name)
|> BclListUtil.ofSeq
答案 2 :(得分:2)
kvb指出,System.Collections.Generic.List<_>
的F#别名为ResizeArray<_>
。 F# PowerPack包含一个ResizeArray module,用于以类似于Seq和List模块的惯用F#方式处理BCL列表。
但是,由于某些奇怪的原因,此模块似乎包括ofArray
和ofList
以及toSeq
,但不包括ofSeq
。
答案 3 :(得分:0)
使用等于System.Collections.Generic.List
的{{3}}
示例:
let languagesList = ResizeArray<string>()
languagesList.Add("1");
languagesList.Add("2");