如何在C#中创建此等效列表?

时间:2018-05-05 14:47:39

标签: c# python list-comprehension

在Python中,我使用此声明创建了一个包含多达1000万个元素的列表,

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

有没有办法在C#中执行等效操作而不迭代列表?我正在尝试这样的事情,

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

但无法弄清楚正确的语法。

1 个答案:

答案 0 :(得分:4)

要获取交替的0和1的列表,请使用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#:

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