意外更改列表的所有元素
Changing all elements of list by accident
我是 C# 编程的新手,这是我第一次 运行 遇到我无法解决的意外代码行为。
List<int[]> snakeCoords = new List<int[]>();
snakeCoords.Add(new int[2] { 25, 10 });
int direction = 0;
while (true)
{
Move(direction);
}
void Move(int direction)
{
int[] headCoords = new int[2];
headCoords = snakeCoords.Last();
switch (direction)
{
case 0:
headCoords[1]--;
snakeCoords.Add(headCoords);
break;
}
这段代码是我在Main{}
中提取的,所以没有受到任何其他因素的影响,还是不行。结果是 snakeCoords.Count = 迭代次数,其中列表的每个元素都是 {25,(10 - 迭代次数)}。我期望和想要的结果是 {25,10}、{25,9}、{25,8} 等元素的列表。
我可以想到一些解决方法,但我真的很想了解这段代码的作用。
您丢弃分配给 headCoords
的 new int[2]
并用列表中已有的数组覆盖它。换句话说,最后你在列表中有 10 个 same 数组的条目,所以每次修改都会反映在所有条目中,因为你每次都在修改一个相同的数组。
确保复制或克隆数组,或将数组中的值复制到新数组,而不是重复使用同样的数组一次又一次。
修复将替换
int[] headCoords = new int[2];
headCoords = snakeCoords.Last();
和
int[] headCoords = (int[]) snakeCoords.Last().Clone();
我是 C# 编程的新手,这是我第一次 运行 遇到我无法解决的意外代码行为。
List<int[]> snakeCoords = new List<int[]>();
snakeCoords.Add(new int[2] { 25, 10 });
int direction = 0;
while (true)
{
Move(direction);
}
void Move(int direction)
{
int[] headCoords = new int[2];
headCoords = snakeCoords.Last();
switch (direction)
{
case 0:
headCoords[1]--;
snakeCoords.Add(headCoords);
break;
}
这段代码是我在Main{}
中提取的,所以没有受到任何其他因素的影响,还是不行。结果是 snakeCoords.Count = 迭代次数,其中列表的每个元素都是 {25,(10 - 迭代次数)}。我期望和想要的结果是 {25,10}、{25,9}、{25,8} 等元素的列表。
我可以想到一些解决方法,但我真的很想了解这段代码的作用。
您丢弃分配给 headCoords
的 new int[2]
并用列表中已有的数组覆盖它。换句话说,最后你在列表中有 10 个 same 数组的条目,所以每次修改都会反映在所有条目中,因为你每次都在修改一个相同的数组。
确保复制或克隆数组,或将数组中的值复制到新数组,而不是重复使用同样的数组一次又一次。
修复将替换
int[] headCoords = new int[2];
headCoords = snakeCoords.Last();
和
int[] headCoords = (int[]) snakeCoords.Last().Clone();