我需要创建一个动态大小的列表,其中包含使用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的值作为新对象存储到列表中?
我搜索了这个,但我不确定我是否知道适当的词汇来确定搜索结果。
答案 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
,结果会有所不同。