F # - Как заполнить System.Collections.Generic.List из массива - PullRequest
9 голосов
/ 02 марта 2010

У меня есть следующий код, который заполняет System.Collections.Generic.List Мне не нравится, поэтому мне было интересно, есть ли лучший способ сделать это.

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)

Ответы [ 4 ]

17 голосов
/ 02 марта 2010

Вы пробовали:

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

List<'T> имеет конструктор, который принимает IEnumerable<'T>, поэтому он с радостью принимает любые seq<'T>, которые вы передаете ему.

6 голосов
/ 02 марта 2010

В дополнение к ответу Мехрдада

Я считаю полезным определить вспомогательные модули для многих стандартных коллекций и типов .Net, чтобы сделать их более удобными для F #. Здесь я бы определил следующее

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)

Тогда вы можете изменить свой исходный код на следующий

let getDirectories = 
        Directory.GetDirectories(_baseFolder)
let languagesList = 
      getDirectiories
      |> Seq.map (fun dir -> (new DirectoryInfo(dir)).Name)
      |> BclListUtil.ofSeq
2 голосов
/ 02 марта 2010

Псевдоним F # для System.Collections.Generic.List<_> равен ResizeArray<_>, как отметил kvb. F # PowerPack включает в себя модуль ResizeArray для работы со списками BCL идиоматическим способом F #, аналогичным модулям Seq и List.

Однако по какой-то странной причине этот модуль, похоже, включает ofArray и ofList и toSeq, но не ofSeq.

0 голосов
/ 20 января 2019

Использовать ResizeArray , что равно System.Collections.Generic.List

Пример:

let languagesList = ResizeArray<string>()
languagesList.Add("1");
languagesList.Add("2");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...