Инициализируйте и присвойте значения списку целых без цикла - PullRequest
1 голос
/ 24 мая 2010

есть более короткий способ сделать это:

        List<int> mins = new List<int>();
        for(int i = 0; i<60; i++)
        {
            mins.Add(i+1);
        }

Функциональная версия также приветствуется, если доступна в c #, также ценится версия f #.

Ответы [ 4 ]

9 голосов
/ 24 мая 2010

F #:

open System.Collections.Generic 
let r = new List<_>( [1..60] )

C #:

var r = new List<int>(Enumerable.Range(1, 60));
4 голосов
/ 24 мая 2010

В F # я, вероятно, написал бы:

[ 1 .. 60 ] |> ResizeArray.ofSeq

Это то же самое, что явный вызов конструктора, но у него немного более приятный синтаксис (вы можете использовать конвейеризацию и вам не нужно указыватьпараметр типа конструктора).

3 голосов
/ 24 мая 2010

Это будет сделано для версии C #:

List<int> mins = Enumerable.Range(1, 60).ToList();

То, что будет зацикливаться внутри, по общему признанию. Если вы довольны IEnumerable<int>, просто отключите вызов ToList, и вы получите ленивую оценку. У вас уже есть версии F #, я вижу:)

2 голосов
/ 24 мая 2010

List<_> в C # - это динамический массив, а не связанный список. В F # List<_> равно ResizeArray<_>.

Вот прямо переведенная версия F #:

let mins = new ResizeArray<int> ()
for i=0 to 60-1 do
    mins.Add(i+1)

Вы можете использовать ResizeArray модуль:

#r "FSharp.PowerPack.dll"
let mins = ResizeArray.init 60 (fun i -> i+1)

Обратите внимание, что тип ResizeArray <_> определен в F # Core, такой же модуль имени находится в F # PowerPack.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...