Как я могу создать этот эквивалентный список в C #? - PullRequest
0 голосов
/ 05 мая 2018

В Python я создаю список до 10 миллионов элементов с этим объявлением,

res = [0, 1] * (N // 2) + [1]

Есть ли способ сделать эквивалент в C # без перебора списка? Я пытаюсь что-то вроде этого,

List<int> res = Enumerable.Repeat(0, N).ToList();

Но не могу понять правильный синтаксис.

1 Ответ

0 голосов
/ 05 мая 2018

Чтобы получить список чередующихся нулей и единиц, используйте Enumerable.Range, а затем выполните по модулю результат:

var N = 10;
var res = Enumerable.Range(0, N).Select(x => x % 2);

Выход:

0 1 0 1 0 1 0 1 0 1


Если вы хотите повторить произвольную последовательность, вы должны использовать Enumerable.Repeat, а затем объединить итераторы, используя SelectMany:

var res = Enumerable.Repeat(new [] {1, 4, 3}, N).SelectMany(x => x);

Выход:

1 4 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3 1 4 3

Вместо массива (или списка) вы могли бы также поставить Enumerable.Range или любой другой метод итератора:

var res = Enumerable.Repeat(Enumerable.Range(0,2), N).SelectMany(x => x);

, который снова создает список чередующихся 0 и 1.


Чтобы добавить один элемент в конце, используйте Concat:

var res = Enumerable.Range(0, N).Select(x => x % 2).Concat(new [] {1});

Выход:

0 1 0 1 0 1 0 1 0 1 1


Так что в основном из Python в C #:

  • * & rarr; Enumerable.Repeat
  • + & rarr; Enumerable.Concat
  • [a,b,c] & rarr; new [] {a,b,c}
...