0

我需要创建一个整数数组列表。我提前知道数组的长度,但我不知道有多少需要添加到列表中。

我试过以下代码:

    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以所有条目重复的最后一次迭代结束。我哪里错了?

4

3 回答 3

4

当您将临时数组添加到 时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);
}
于 2013-09-09T20:06:54.707 回答
0

你只需要移动这条线:

int[] temp = new int[30]; 

之后立马:

for (int i = 0; i < values.GetLength(0); i++) {

所以它在循环的每次迭代中初始化为一个新数组。

MyListOfArrays.Add正在为 的每次迭代添加相同的引用列表i,并且每次都会覆盖值temp[]。因此,您最终会重复上一次迭代的值。

于 2013-09-09T20:17:20.863 回答
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);
}
于 2013-09-09T20:10:59.213 回答