C#:无法分配给foreach迭代变量

时间:2010-02-04 00:51:11

标签: c# loops xna foreach

我试图通过将它包装在循环中来压缩它:

       if (pos.X + pixelRadius < 0) {
            pos.X = bounds.Width - pixelRadius;
        } else if (pos.X + pixelRadius > bounds.Width) {
            pos.X = pixelRadius;
        }

        if (pos.Y + pixelRadius < 0) {
            pos.Y = bounds.Heigh - pixelRadius;
        } else if (pos.Y + pixelRadius > bounds.Height) {
            pos.Y = pixelRadius;
        }

我的第一直觉是做这样的事情:

        foreach (float coord in new float[] { pos.X, pos.Y }) {
            float upperBound = (coord == pos.X ? bounds.Width : bounds.Height);
            if (coord + pixelRadius < 0) {
                coord = upperBound - pixelRadius;
            } else if (coord + pixelRadius > upperBound) {
                coord = pixelRadius;
            }
        }

但当然我收到错误消息:

Cannot assign to 'coord' because it is a 'foreach iteration variable'

有什么方法可以将这段代码包装在一个循环中?或者也许这不值得付出努力,而且留下第一种形式更具可读性。

对于那些好奇的人:是的,这是实现环绕。

5 个答案:

答案 0 :(得分:6)

老实说,我认为第一个版本更具可读性。第二个版本在循环中批量填充然后...测试以查看它是哪个循环元素?闻起来像我for...case反模式。

答案 1 :(得分:4)

我认为这是在尝试模数学,所以这就是你想要的

pos.X %= bounds.Width;
pos.Y %= bounds.Height;

它没有给出与上面代码完全相同的行为,但是如果你只是调整边界并在做模数之前对该点施加偏差就可以了。

或者如果您需要偏见

pos.X = ((pos.X - pixelRadius) % bounds.Width) + pixelRadius;
pos.Y = ((pos.Y - pixelRadius) % bounds.Height) + pixelRadius;

模数学是一种更好的环绕式方法。它更清晰,没有分支。

答案 2 :(得分:3)

即使你可以改变coord,因为它是一个浮点数,你实际上只是修改副本而不是pos中的值。最好的办法是创建一种新方法。

答案 3 :(得分:0)

我会把它留在原来的形式。当您处于上述循环中时,coordpos.Xpos.Y变量的 COPY ,因为它们是Value Types。这意味着即使你可以更新coord ......你也不会更新pos.Xpos.Y,而是更新它们本地的循环。

答案 4 :(得分:0)

循环是一个坏主意。

你现在拥有的代码看起来有些错误,但它的结构比一些不自然的循环使用更好。

如果我明白你要做什么,我想你应该有这样的事情

(我专注于坐标X.在坐标Y的情况下,它类似)

pos.X += pixelRadius;
if(pos.X < 0) {
    pos.X += bounds.Width;
} else if (pos.X > bounds.Width) {
    pos.X -= bounds.Width;           
}

如果| pixelRadius |,这将有效&LT; bounds.With和我假设数字是浮点数,如带循环的例子所示。

模数运算符使事情变得更容易,尤其是| pixelRadius | &GT; bounds.With,但在负数的情况下要小心。您必须确切地知道您的语言实现将与他们做什么

使用模数运算符我会这样做

pos.X = (pos.X + pixelRadius) % bounds.Width;
if(pos.X < 0) pos.X += bounds.Width;