在Python中,我使用此声明创建了一个包含多达1000万个元素的列表,
res = [0, 1] * (N // 2) + [1]
有没有办法在C#中执行等效操作而不迭代列表?我正在尝试这样的事情,
List<int> res = Enumerable.Repeat(0, N).ToList();
但无法弄清楚正确的语法。
答案 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}