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");
精彩评论