C#:如何只将2D数组的值添加到动态大小的列表中?

时间:2017-01-19 20:07:03

标签: c# visual-studio list

我需要创建一个动态大小的列表,其中包含使用C#的窗口表单的点对。列表大小将根据加载的数据而变化。 简单地传达问题的方法的简化版本如下(在真实的应用程序中,for循环将根据加载的数据迭代大小):

        int[,] dummyInt = new int[1, 2];
        List<int[,]> test = new List<int[,]>();


        for (int i = 0; i < 100; i++)
        {
            dummyInt[0, 0] = i;
            for (int j = 0; j < 5; j++)
            {
                dummyInt[0, 1] = j;
                test.Add(dummyInt);
            }
        }

        //Show the values in the list for debugging
        foreach (int[,] value in test)
        {
            MessageBox.Show(value.ToString("G"));
        }

使用这种方法,列表中的所有500个值都是[99,4]。

我期待/希望得到的是

值1 [0,0]

值2 [0,1]

...

值500 [99,4]

似乎列表存储实际变量,然后在for循环的每次迭代中更改值。如何将dummyInt的值作为新对象存储到列表中?

我搜索了这个,但我不确定我是否知道适当的词汇来确定搜索结果。

2 个答案:

答案 0 :(得分:0)

您的NSTextFields对象正在存储对List对象的引用。如果您想在dummyInt中存储不同的值,则每次将其添加到List时都必须创建新的int数组。

参考: https://msdn.microsoft.com/en-gb/library/4d43ts61(v=vs.90).aspx

答案 1 :(得分:0)

首先,如果您只是存储一对坐标,则不需要二维数组。第一个坐标可以位于一维数组的第一个元素中,第二个坐标可以位于数组的第二个元素中。其次,如果要强制存在整个数组的单独副本,则可以使用Clone方法制作数组对象的副本。

int[] dummyInt = new int[2];
List<int[]> test = new List<int[]>();
for (int i = 0; i < 100; i++)
{
   dummyInt[0] = i;
   for (int j = 0; j < 5; j++)
   {
      dummyInt[1] = j;
      test.Add((int[])dummyInt.Clone());
   }
}

foreach (int[] value in test)
{
   Console.WriteLine("({0},{1})", value[0], value[1]);
}

最后,数组可能不是存储一对坐标的最佳方式。您可能想要使用元组或创建自己的结构。如果您使用值类型(结构)而不是引用类型(类),则不需要克隆每个类型。

struct Pair
{
   public int x;
   public int y;
}

public class Test
{
   public static void Main()
   {
      Pair dummyInt = new Pair();
      List<Pair> test = new List<Pair>();
      for (int i = 0; i < 100; i++)
      {
         dummyInt.x = i;
         for (int j = 0; j < 5; j++)
         {
            dummyInt.y = j;
            test.Add(dummyInt);
         }
      }

      foreach (Pair value in test)
      {
         Console.WriteLine("({0},{1})", value.x, value.y);
      }
   }
}

请注意,如果您将开头的struct更改为class,结果会有所不同。