我可以使用LINQ以更紧凑的方式编写此for循环吗?

时间:2018-10-31 08:56:00

标签: c# linq

有什么方法可以使用LINQ清理此类循环?我真的认为这种方法应该与LINQ一起使用。但是我不明白。

我的方法如下:

int[] MakeList(int stepWidth)
{
    var ret = new List<int>();
    for (var i=0;i<360;i+=stepWidth)
    {
        ret.Add(i);
    }

    return ret.ToArray();
}

我唯一能想到的解决方案是:

Enumerable.Range(0, 360).Where(x => x % stepWidth == 0).ToArray();

但是这个Enumerabl.Range(0,360)对我来说似乎太粗糙了:)

2 个答案:

答案 0 :(得分:1)

.Select.TakeWhile的组合可能是一种方法,但看起来与其他方法非常接近

var result = Enumerable.Range(0, int.MaxValue)
                       .Select(i => i * step)
                       .TakeWhile(i => i < 360)
                       .ToArray();

答案 1 :(得分:1)

首先:您的代码漂亮且可读。

第二:不要害怕循环-循环完美地显示了程序员的意图。如果必须更改某些内容,则可以消除List<i>

int[] MakeList(int stepWidth)
{
    var length = (360 + stepWidth - 1) / stepWidth;
    var ret = new int[length];
    for (var i = 0; i < length; i++)
    {
        ret[i] = i * stepWidth;
    }

    return ret;
}

第三:如果经常使用LINQ,我将返回IEnumerable<int>(请参见生成器):

IEnumerable<int> MakeSequence(int step)
{
    for (var i = 0; i < 360; i += step)
        yield return i;
}

并按如下所示使用它:MakeSequence(x).ToArray()MakeSequence(x).[SomeLinqMethods]