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

时间:2010-03-02 19:51:44

标签: 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)

4 个答案:

答案 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列表。

但是,由于某些奇怪的原因,此模块似乎包括ofArrayofList以及toSeq,但不包括ofSeq

答案 3 :(得分:0)

使用等于System.Collections.Generic.List的{​​{3}}

示例:

let languagesList = ResizeArray<string>()
languagesList.Add("1");
languagesList.Add("2");