F# - 如何从数组填充System.Collections.Generic.List

Ene*_*nes 9 f#

我有以下代码填充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)
Run Code Online (Sandbox Code Playgroud)

Meh*_*ari 17

你有没有尝试过:

let list = new System.Collections.Generic.List<string>(arr)
Run Code Online (Sandbox Code Playgroud)

List<'T>有一个构造函数,IEnumerable<'T>所以它很乐意接受任何seq<'T>你传递给它.


Jar*_*Par 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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以将原始代码更改为以下内容

let getDirectories = 
        Directory.GetDirectories(_baseFolder)
let languagesList = 
      getDirectiories
      |> Seq.map (fun dir -> (new DirectoryInfo(dir)).Name)
      |> BclListUtil.ofSeq
Run Code Online (Sandbox Code Playgroud)

  • 另请注意,您可以使用较短(可能不太模糊)的类型缩写`ResizeArray <_>`而不是`System.Collections.Generic.List <_>`. (4认同)