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");
加载中,请稍侯......
精彩评论