开发者

F# - How to populate an System.Collections.Generic.List from array

I have following code that populates a System.Collections.Generic.List I don't like it so I was wonde开发者_运维问答ring if there is a better way to do this.

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)


Have you tried:

let list = new System.Collections.Generic.List<string>(arr)

List<'T> has a constructor that takes an IEnumerable<'T> so it happily takes any seq<'T> you pass to it.


In addition to Mehrdad's answer

I find it helpful to define helper modules for many standard collections and .Net types to make them more F# friendly. Here I would define the following

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)

Then you could change your original code to the following

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


The F# alias for System.Collections.Generic.List<_> is ResizeArray<_> as kvb noted. The F# PowerPack includes a ResizeArray module for working with BCL Lists in an idiomatic F# fashion similar to the Seq and List modules.

However, for some strange reason this module seems to include ofArray and ofList and toSeq but not ofSeq.


Use ResizeArray that equals System.Collections.Generic.List

Example:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜