2010-03-02 8 views
8

J'ai le code suivant qui remplit un System.Collections.Generic.List Je ne l'aime pas, donc je me demandais s'il y avait une meilleure façon de faire ce.F # - Comment remplir un System.Collections.Generic.List à partir du tableau

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) 

Répondre

16

Avez-vous essayé:

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

List<'T> a un constructeur qui prend un IEnumerable<'T> il prend heureusement toute seq<'T> vous passez.

6

En plus de la réponse

de Mehrdad je trouve utile de définir des modules d'aide pour de nombreuses collections standards et types .Net pour les rendre plus F # amicale. Ici, je définirais les éléments suivants

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) 

Ensuite, vous pouvez changer votre code d'origine à ce qui suit

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

Notez également que vous pouvez utiliser l'abréviation de type abrégé (et potentiellement moins ambigu) 'ResizeArray <_>' au lieu de 'System.Collections.Generic.List <_>'. – kvb

+0

@kvb, merci, je ne savais pas qu'il y avait déjà un alias de type présent. – JaredPar

2

L'alias F # pour System.Collections.Generic.List<_> est ResizeArray<_> comme KVB noté. Le F# PowerPack inclut un ResizeArray module pour travailler avec les listes BCL dans un mode F # idiomatique similaire aux modules Seq et List.

Cependant, pour une raison étrange ce module semble inclure ofArray et ofList et toSeq mais pas ofSeq.

Questions connexes