C#存储错误值的嵌套列表

C#存储错误值的嵌套列表,c#,list,C#,List,我正在努力处理c#中的嵌套列表。我正在用Excel数据填充列表。为此,我将一列中的所有数据存储在subdlist2中,然后将其添加到我的主列表termsList中。 但是,在显示列表内容的最后,值不是来自多行的值,而是由最后一列的值替换。列表内容存储是否作为参考而不是值? 示例:我有5行,具有不同的值,第五行的值替换所有值 for (i = 0; i < num_speed; i++) { lastrow_current = GetLastUsedRow(current

我正在努力处理c#中的嵌套列表。我正在用Excel数据填充列表。为此,我将一列中的所有数据存储在subdlist2中,然后将其添加到我的主列表termsList中。
但是,在显示列表内容的最后,值不是来自多行的值,而是由最后一列的值替换。列表内容存储是否作为参考而不是值?
示例:我有5行,具有不同的值,第五行的值替换所有值

for (i = 0; i < num_speed; i++)
   {
       lastrow_current = GetLastUsedRow(currentWorksheet, 12 + i * 11);
       for (int j = 0; j < lastrow_current; j++)
       {
           if (currentWorksheet.Cells[j + 6, 12 + i * 11].Value != null)
           {
               if (j == 0)
               {
                   sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11].Value.ToString());
               }
               else
               {
               sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11].Value.ToString());
               }
           }
       }
       termsList.Add(sublist2);
   }
   termsList.Add(sublist2);
   foreach (var sublist3 in termsList)
   {
       foreach (var value in sublist3)
       {
           Console.Write(value);
           Console.Write(' ');
       }
       Console.WriteLine();
   }
for(i=0;i
很难从您的简短示例中说出来。请更新示例,以便包括列表的初始化

但列表确实是一个参考对象。您应该为每一行实例化一个新列表

您的代码应该如下所示:

var rows = new List<List<string>>();
for (row = 0; row < maxRow; row++)
{
  var row = new List<string>();
  for (column = 0; column < maxColumn; column++)
  {
    var value = sheet[row, column];
    row.Add(value);
  }
  rows.Add(row);
}

然后继续使用值…

源代码中有很多东西让人困惑,因此首先我尝试对其进行一点排序:

// List<List<string>> termsList = the list to fill with nested lists
//        List<string> sublist2 = a list created outside the loop
//                    num_speed = number of columns to process

for (i = 0; i < num_speed; i++)
{
    var currentColumn   = 12 + i * 11; // taken from if (currentWorksheet.Cells[j + 6, 12 + i * 11]
    var differentColumn = 13 + i * 11; // taken from sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11]

    var lastRowOfCurrentColumn = GetLastUsedRow(currentWorksheet, currentColumn);

    for (int j = 0; j < lastRowOfCurrentColumn; j++)
    {
        var currentRow = j + 6; // taken from currentWorksheet.Cells[j + 6,

        var currentCell = currentWorksheet.Cells[currentRow, currentColumn];
        var differentCell = currentWorksheet.Cells[currentRow, anotherColumn];

        // here you are checking if the cell has a value ...
        if (currentCell.Value != null)
// was  if (currentWorksheet.Cells[j + 6, 12 + i * 11].Value != null)
        {
            if (j == 0)
            {
                // ... but here ...
                sublist2.Add(differentCell.Value.ToString());
        // was  sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11].Value.ToString());
            }
            else
            {
                // ... and here you are adding a value from a cell
                // out of a different column to the list
                sublist2.Add(differentCell.Value.ToString());
        // was  sublist2.Add(currentWorksheet.Cells[j + 6, 13 + i * 11].Value.ToString());
            }
        }
    }

    // Here you are adding the same list to the parent list
    // again and again for every row ...
    termsList.Add(sublist2);
}

// ... and outside the loop you are adding that list again to the parent
termsList.Add(sublist2);
//List termsList=要用嵌套列表填充的列表
//List sublist2=在循环外部创建的列表
//num_speed=要处理的列数
对于(i=0;i
因此,除了检查一个单元格的值外,还使用来自不同单元格的值添加到列表中,您在每一行使用相同的列表

要为每一行创建单独的列表,并使用实际选中的列,您必须如下更改代码:

for (int j = 0; j < lastRowOfCurrentColumn; j++)
{
    var listForRow = new List<string>();
// ...
                listForRow.Add(currentCell.Value.ToString());
// ...
    termsList.Add(listForRow);
}
for(int j=0;j

并删除循环外部多余的嵌套列表。

您可以提供一个数据和输出的示例吗?无论如何,您永远不会为
子列表2
创建新实例,因此
termsList
中的所有成员实际上都是相同的列表实例,这应该是不正确的。
for (int j = 0; j < lastRowOfCurrentColumn; j++)
{
    var listForRow = new List<string>();
// ...
                listForRow.Add(currentCell.Value.ToString());
// ...
    termsList.Add(listForRow);
}