我有一个数组,其中包含两个值,这些值应该表示x和y图上的一个点,第一个值是该点的x值,第二个值是该点的y值。
然后我想将包含在正方形区域中的所有点存储在列表中。
我在数组添加到列表的地方放置了一个断点,似乎在列表中添加了正确的值,即: 100 10 100 9 等
但是当我运行程序时,列表中的每个数组将为array [0]打印105,为array [1]打印5。
class Program
{
static void Main(string[] args)
{
List<int[]> points = new List<int[]>();
int[] point = new int[2];
string topLeftCornerX = "100";
string topLeftCornerY = "10";
for (int i = int.Parse(topLeftCornerX); i < int.Parse(topLeftCornerX) +6; i++)
{
point[0] = i;
for (int j = int.Parse(topLeftCornerY); j > int.Parse(topLeftCornerY) -6; j--)
{
point[1] = j;
points.Add(point);
}
}
foreach (int[] item in points)
{
Console.WriteLine(item[0]);
Console.WriteLine(item[1]);
}
Console.ReadLine();
}
}
我将数组添加到列表的方式还是打印值的方式有问题吗?
答案 0 :(得分:3)
您一直在更新point
数组的值,该数组始终指向相同的内存位置。您应该在内部循环中将其设置为new
数组,以便它引用一个新数组(以及内存中的其他位置),然后在其中分配值。
List<int[]> points = new List<int[]>();
string topLeftCornerX = "100";
string topLeftCornerY = "10";
for (int i = int.Parse(topLeftCornerX); i < int.Parse(topLeftCornerX) + 6; i++)
{
for (int j = int.Parse(topLeftCornerY); j > int.Parse(topLeftCornerY) - 6; j--)
{
int[] point = new int[2];
point[0] = i;
point[1] = j;
points.Add(point);
}
}
foreach (int[] item in points)
{
Console.WriteLine(item[0]);
Console.WriteLine(item[1]);
}
Console.ReadLine();
话虽这么说,使用具有Point
和X
属性的Y
结构可能更有意义。与int[]
相比,这更具描述性,更易于使用:
List<Point> points = new List<Point>();
string topLeftCornerX = "100";
string topLeftCornerY = "10";
for (int i = int.Parse(topLeftCornerX); i < int.Parse(topLeftCornerX) + 6; i++)
{
for (int j = int.Parse(topLeftCornerY); j > int.Parse(topLeftCornerY) - 6; j--)
{
points.Add(new Point(i, j);
}
}
foreach (Point item in points)
{
Console.WriteLine($"[{item.X}, {item.Y}]");
}
Console.ReadLine();
答案 1 :(得分:0)
因为在这里您要修改相同的数组(相同的引用),然后将其再次添加到列表中
要使其正常工作:
在循环的每个循环中,创建数组point = new int[2];
但是,使用结构或类表示点会更好。