【问题标题】:C# nested list storing incorrect valuesC# 嵌套列表存储不正确的值
【发布时间】:2016-09-23 23:13:02
【问题描述】:

我正在努力解决 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();
   }

【问题讨论】:

  • 能否提供数据和输出的示例?不管怎样,你永远不会为sublist2创建一个新实例,所以termsList中的所有成员实际上都是同一个list实例,这应该是不正确的。

标签: c# list


【解决方案1】:

从您的简短示例中很难说。请更新示例,以便包含列表的初始化

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

您的代码应如下所示:

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);
}

请注意,您应该为变量指定一个清晰的名称(不是 i,j)。此外,您应该使用临时变量将数据放入: 不要把 currentWorksheet.Cells[j + 6, 13 + i * 11].Value 到处乱放,只用一次

var value = currentWorksheet.Cells[j + 6, 13 + i * 11].Value;

然后重新使用该值...

【讨论】:

    【解决方案2】:

    您的源代码中有很多令人困惑的地方,所以首先我尝试对其进行一点排序:

    // 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);
    

    因此,除了检查一个单元格的值,而是使用来自不同单元格的值添加到列表之外,您在每一行都使用相同的列表。

    要为每一行设置一个单独的列表并使用实际检查的列,您必须像这样更改代码:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-24
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-01
      • 1970-01-01
      相关资源
      最近更新 更多