我列出了这样的内容:
var query = Enumerable.Range(0, drea2.count / 4 * 1440).Select((n, index) =>
{
if ((index >= 480 && index < 750) || (index >= 810 && index < 1080))
return 0;
else if (index >= 750 && index < 810)
return 1;
else
return 2;
});
但是,该范围必须是可变的。例如;
我还有一个包含这些索引的列表。这些索引可能彼此不同。
1440表示1440分钟。一天我想将1440添加到这些索引。例如:
查询[0],...查询[479] = 2 ---查询[1440],...查询[1919] = 2 ---查询[2880] = 2
查询[480],..查询[749] = 0,---查询[810],..查询[1079] = 0,---查询[1920],..查询[2189] = 0。
因此,无论drea2列表的计数如何,查询的大小都为(drea2.count / 4 * 1440)
我怎样才能做到这一点?
编辑:如果drea2.Count()返回6,我的if条件必须每个1440索引具有6个不同的短语。对于第一种情况:(并且查询范围现在必须具有7200的大小)
if ((index >= 480 && index < 750) || (index >= 810 && index < 1080))
return 0; // for 1
if ((index >= 480 + 1440 && index < 750 + 1440) || (index >= 810 + 1440 && index < 1080 + 1440))
return 0; // for 2
... // for 3 (+ 2880)
... // for 4 (+ 4320)
... // for 5 (+ 5760)
if ((index >= 480 + 7200 && index < 750 + 7200) || (index >= 810 + 7200 && index < 1080 + 7200))
最佳答案
根据OP的更新,我已经重写了答案。有关以前版本的参考,请遵循this link。
这是建议的解决方案,假设drea2
集合是数组或列表(因此实现了IList<int>
接口),并且此列表中的每个4
项都构成了要在生成的1440
序列中使用的范围项目:
public IEnumerable<int> GetQuery(IList<int> drea2)
{
var count = drea2.Count;
var result = new int[(count/4)*1440];
for (var i = 0, fillIndexStart = 0; i < count; i+= 4, fillIndexStart += 1440) {
var rangeIndices = new[] {
drea2[i],
drea2[i+1],
drea2[i+2],
drea2[i+3]
};
for (var j = 0; j < rangeIndices[0]; j++) {
result[fillIndexStart + j] = 2;
}
for (var j = rangeIndices[3]; j < 1440; j++) {
result[fillIndexStart + j] = 1;
}
}
return result;
}
不幸的是,这里没有
Linq
,但我希望它能完成所需的工作。前面的代码将使用此条件,而不是上面方法中的两个for循环:
if ((j >= rangeIndices[0] && j < rangeIndices[1])
|| (j >= rangeIndices[2] && j < rangeIndices[3]))
result[fillIndexStart + j] = 0;
else if (j >= rangeIndices[1] && j < rangeIndices[2])
result[fillIndexStart + j] = 1;
else
result[fillIndexStart + j] = 2;
由于数组始终填充默认值,因此我们可以利用
result
充满零的优势。这就是为什么我将条件重写为2个for
循环的原因注意。上面的代码依靠
drea2.Count / 4
为0
。否则,初始化IndexOutOfRangeException
数组时将得到rangeIndices
。