我列出了这样的内容:

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 / 40。否则,初始化IndexOutOfRangeException数组时将得到rangeIndices

10-08 14:54