是否可以使用foreach更新数组元素?

时间:2017-01-12 10:44:20

标签: c#

使用for循环填充数组很容易:

ulong[] chessArray = new ulong[64];
chessArray[0] = 1;
for (int i = 1; i < 64; i++)
{
    chessArray[i] = 2 * chessArray[i - 1];
}

但有没有办法使用foreach运算符?以下代码不会编译:

ulong[] chessArray = new ulong[64];
chessArray[0] = 1;
foreach (int element in chessArray)
{
    element = 2 * (element - 1);
}

4 个答案:

答案 0 :(得分:2)

  

有没有办法使用foreach运算符?

没有。循环变量element是一个只读变量,包含数组元素的副本,它是变量。它不是数组元素变量的别名

答案 1 :(得分:0)

无法使用foreach修改您正在迭代的数组,请查看以下链接:https://msdn.microsoft.com/en-us/library/ttw7t8t6.aspx

答案 2 :(得分:0)

为何选择foreach?您的目标是填充一个数组,其中每个元素的值都基于前一个元素。 Clojure本身支持iterate创建序列。

(take 10 (iterate (partial * 2) 1)) //(1 2 4 8 16 32 64 128 256 512)

如果您想要take 64,请注意整数溢出。

同样的想法可以适用于C#。 (请告诉我是否已经有迭代功能)。

public static IEnumerable<T> Iterate<T>(Func<T, T> f, T seed)
{
    var val = seed;
    while (true)
    {
        yield return val;
        val = f(val);
    }
}

然后你可以通过

填充一个数组
Iterate(i => i * 2, (ulong)1).Take(64).ToArray()

答案 3 :(得分:0)

其他答案和评论已经很好地表明你不能在foreach循环中写入循环变量。但是,即使这是可能的,问题中的两个循环也不会做同样的事情:

您无法通过element - 1访问循环变量的先前值!相反,这将在当前变量加倍之前简单地减去一个变量。结果完全独立于之前的值。

即。您的foreach循环将与2 * chessArray[i] - 1;循环中的for对应。