如何在C#

时间:2019-02-25 00:36:16

标签: c# arrays list

我有一个数组,其中包含两个值,这些值应该表示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();
    }
}

我将数组添加到列表的方式还是打印值的方式有问题吗?

2 个答案:

答案 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();

话虽这么说,使用具有PointX属性的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];

的新引用

但是,使用结构或类表示点会更好。