如何在C#中初始化整数数组列表?

时间:2013-09-09 20:03:57

标签: c# arrays list

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

我尝试过以下代码:

    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的最后一次迭代。我哪里错了?

3 个答案:

答案 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[]中的值。所以你最终得到了重复的最后一次迭代的值。