我需要创建一个整数数组列表。我提前知道数组的长度,但我不知道有多少需要添加到列表中。
我尝试过以下代码:
List<int[]> MyListOfArrays = new List<int[]>();
int[] temp = new int[30];
range = xlApp.get_Range("NamedRange");
values = (object[,])range.Value2;
for (int i = 0; i < values.GetLength(0); i++)
{
for (int j = 0; j < values.GetLength(1); j++)
{
temp[j] = Convert.ToInt32(values[i + 1, j + 1]);
}
MyListOfArrays.Add(temp);
}
temp
数组填充得很好。但是,MyListOfArrays
最终会对所有条目重复temp
的最后一次迭代。我哪里错了?
答案 0 :(得分:4)
将temp数组添加到List
时,它只是指向堆上创建的数组的指针。您需要为添加到列表中的每个数组创建一个新的临时数组。
List<int[]> MyListOfArrays = new List<int[]>();
range = xlApp.get_Range("NamedRange");
values = (object[,])range.Value2;
for (int i = 0; i < values.GetLength(0); i++)
{
int[] temp = new int[30]; // moved inside the loop
for (int j = 0; j < values.GetLength(1); j++)
{
temp[j] = Convert.ToInt32(values[i + 1, j + 1]);
}
MyListOfArrays.Add(temp);
}
答案 1 :(得分:0)
这是最容易解决的问题。
您的代码:
List<int[]> MyListOfArrays = new List<int[]>();
int[] temp = new int[30];// <-- Move this inside the 'i' for-loop.
range = xlApp.get_Range("NamedRange");
values = (object[,])range.Value2;
for (int i = 0; i < values.GetLength(0); i++)
{
for (int j = 0; j < values.GetLength(1); j++)
{
temp[j] = Convert.ToInt32(values[i + 1, j + 1]);
}
MyListOfArrays.Add(temp);
}
请改为:
List<int[]> MyListOfArrays = new List<int[]>();
range = xlApp.get_Range("NamedRange");
values = (object[,])range.Value2;
for (int i = 0; i < values.GetLength(0); i++)
{
int[] temp = new int[30]; //<-- This will create a new array of ints, with each iteration of 1.
for (int j = 0; j < values.GetLength(1); j++)
{
temp[j] = Convert.ToInt32(values[i + 1, j + 1]);
}
MyListOfArrays.Add(temp);
}
答案 2 :(得分:0)
你只需要移动一行:
int[] temp = new int[30];
紧接着:
for (int i = 0; i < values.GetLength(0); i++) {
所以它在循环的每次迭代时初始化为一个新数组。
MyListOfArrays.Add
为每个i
次迭代添加相同的引用列表,并且每次都会覆盖temp[]
中的值。所以你最终得到了重复的最后一次迭代的值。