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

C# 是否可以使用foreach更新数组元素?,c#,C#,使用for循环很容易填充数组: ulong[] chessArray = new ulong[64]; chessArray[0] = 1; for (int i = 1; i < 64; i++) { chessArray[i] = 2 * chessArray[i - 1]; } 有没有一种方法可以使用foreach操作符来实现 否。循环变量元素是一个只读变量,它包含数组元素值的副本,数组元素是一个变量。它不是数组元素变量的别名 有没有一种方法可以使用foreach操作符来实

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

ulong[] chessArray = new ulong[64];
chessArray[0] = 1;
for (int i = 1; i < 64; i++)
{
    chessArray[i] = 2 * chessArray[i - 1];
}
有没有一种方法可以使用foreach操作符来实现

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

有没有一种方法可以使用foreach操作符来实现


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

无法修改使用foreach迭代的数组,请检查此链接:

无法修改使用foreach迭代的数组,请检查此链接:

为什么使用foreach?您的目标是填充一个数组,其中每个元素的值都基于上一个元素。Clojure本机支持通过创建这样的序列

如果希望
取64,请注意整数溢出

同样的想法也适用于C。(请告诉我是否已经有迭代函数)


为什么是foreach?您的目标是填充一个数组,其中每个元素的值都基于上一个元素。Clojure本机支持通过创建这样的序列

如果希望
取64,请注意整数溢出

同样的想法也适用于C。(请告诉我是否已经有迭代函数)


其他答案和注释已经很好地表明,您无法在
foreach
循环中写入循环变量。然而,即使这是可能的,问题中的两个循环也不会做同样的事情:

不能通过
元素-1
访问循环变量的上一个值!取而代之的是,在当前变量加倍之前,只需从中减去一即可。结果与之前的值完全无关


即,您的
foreach
循环将对应于
2*chessArray[I]-1for
循环中执行code>。

其他答案和注释已经很好地表明,您无法在
foreach
循环中写入循环变量。然而,即使这是可能的,问题中的两个循环也不会做同样的事情:

不能通过
元素-1
访问循环变量的上一个值!取而代之的是,在当前变量加倍之前,只需从中减去一即可。结果与之前的值完全无关


即,您的
foreach
循环将对应于
2*chessArray[I]-1for
循环中执行code>。

无法更新使用foreach迭代的同一数组为什么要更新?您已经知道如何使用
来解决问题,但是,这将创建一个新阵列,当原始阵列在其他地方使用时,可能会产生副作用。@m.rogalski的可能副本:传说国际象棋的发明者从印度皇帝那里得到了一个免费的愿望作为发明的奖励。他希望皇帝能把一粒小麦放在第一块地上,两粒放在第二块地上,四粒放在第三块地上,以此类推,每块地的小麦粒数总是加倍。虽然一开始看起来很容易,但事实证明这项任务是不可能的。我想这可能是问题背后的原因。你不能更新使用ForEach迭代的同一个数组。为什么要更新?您已经知道如何使用
来解决问题,但是,这将创建一个新阵列,当原始阵列在其他地方使用时,可能会产生副作用。@m.rogalski的可能副本:传说国际象棋的发明者从印度皇帝那里得到了一个免费的愿望作为发明的奖励。他希望皇帝能把一粒小麦放在第一块地上,两粒放在第二块地上,四粒放在第三块地上,以此类推,每块地的小麦粒数总是加倍。虽然一开始看起来很容易,但事实证明这项任务是不可能的。我想这个问题的背后可能是计算/可视化。
Enumerable
Aggregate
,但没有
Iterate
。很好的解决方案。
Enumerable
Aggregate
但没有
Iterate
。很好的解决方案。
ulong[] chessArray = new ulong[64];
chessArray[0] = 1;
foreach (int element in chessArray)
{
    element = 2 * (element - 1);
}
(take 10 (iterate (partial * 2) 1)) //(1 2 4 8 16 32 64 128 256 512)
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()