2010-03-02 7 views
8

Tengo el siguiente código que rellena System.Collections.Generic.List No me gusta así que me preguntaba si hay una mejor manera de hacerlo esta.F # - Cómo llenar un System.Collections.Generic.List de la matriz

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) 

Respuesta

16

has necesitado:

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

List<'T> tiene un constructor que toma un IEnumerable<'T> por lo que toma con gusto cualquier seq<'T> se pasa a ella.

6

Además de la respuesta de Mehrdad

me resulta útil para definir los módulos de ayuda para muchas colecciones estándar y tipos de .NET para hacerlos más F # amigable. Aquí yo definiría la siguiente

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) 

entonces usted podría cambiar su código original a la siguiente

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

Tenga en cuenta también que puede utilizar la abreviatura de tipo más corta (y potencialmente menos ambigua) 'ResizeArray <_>' en lugar de 'System.Collections.Generic.List <_>'. – kvb

+0

@kvb, gracias, no me di cuenta de que ya había un alias de tipo presente. – JaredPar

2

El F # alias para System.Collections.Generic.List<_> es ResizeArray<_> como kvb señaló. El F# PowerPack incluye un ResizeArray module para trabajar con Listas BCL de forma idiomática F # similar a los módulos Seq y List.

Sin embargo, por alguna extraña razón este módulo parece incluir ofArray y ofList y toSeq pero no ofSeq.

Cuestiones relacionadas