使用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);
}
答案 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
对应。