c# - List.Add() 问题仅保存最后添加的项目

标签 c#

<分区>

我注意到的问题是这行代码:

tempList.Add(orderables);

在这段完整的代码中:

AssociatedComboItems ai = new AssociatedComboItems();
List<Orderables> tempList = new List<Orderables>();
Orderables orderables = new Orderables();

foreach (var t in comboBox1.Items)
{
    ai.ComboBoxItem = t.ToString();

    for (int i = 0; i < fpSpread1.ActiveSheet.RowCount; i++)
    {
        orderables.Display = fpSpread1.ActiveSheet.Cells[i, 1].Text;
        orderables.ShowInDSR = (bool)fpSpread1.ActiveSheet.Cells[i, 0].Value;
        orderables.DisplayOrder = i;
        tempList.Add(orderables);
    }

    ai.AssociatedItems = tempList;
    tempList.Clear();
    if(AssociatedItems == null)
    AssociatedItems = new List<AssociatedComboItems>();
    AssociatedItems.Add(ai);
}

当我将断点放在上面提到的行 (tempList.Add(orderables); ) 时,它第一次将项目正确添加到 templist 并且它将有一个项目。第二次它会将正确的项目添加到列表中 但是 如果我将鼠标悬停在 tempList 上并想查看其内容,尽管它有两个项目,但它们都是相同 - 它们现在都是添加到列表中的第二个项目。它已经覆盖了第一个。

我无法弄清楚这到底出了什么问题以及为什么会这样。

最佳答案

您需要在 for 循环中 实例化 Orderables;否则,您将在所有迭代中重复使用同一个实例(并每次都覆盖其属性)。

AssociatedComboItems ai = new AssociatedComboItems();
List<Orderables> tempList = new List<Orderables>();

foreach (var t in comboBox1.Items)
{
    ai.ComboBoxItem = t.ToString();

    for (int i = 0; i < fpSpread1.ActiveSheet.RowCount; i++)
    {
        Orderables orderables = new Orderables();  // ← Instantiate here
        orderables.Display = fpSpread1.ActiveSheet.Cells[i, 1].Text;
        orderables.ShowInDSR = (bool)fpSpread1.ActiveSheet.Cells[i, 0].Value;
        orderables.DisplayOrder = i;
        tempList.Add(orderables);
    }

    ai.AssociatedItems = tempList;
    tempList.Clear();
    if(AssociatedItems == null)
    AssociatedItems = new List<AssociatedComboItems>();
    AssociatedItems.Add(ai);
}

与问题无关:您可能会发现 object initializer语法更简洁:

Orderables orderables = new Orderables
{
    Display = fpSpread1.ActiveSheet.Cells[i, 1].Text,
    ShowInDSR = (bool)fpSpread1.ActiveSheet.Cells[i, 0].Value,
    DisplayOrder = i,
};

关于c# - List.Add() 问题仅保存最后添加的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10644412/

相关文章:

c# - SQL 正则表达式 WHERE 列 = 'VALUES' 解析器

c# - LINQ 多重连接与一个左连接

c# - Entity Framework 6 和 SQLite - 无法使用之前删除的条目的 PK 创建条目

c# - 找到与名为 'Account' 的 Controller 匹配的多个类型。 MVC 4 & 使用 RouteConfig.CS

c# - 静态变量的问题

c# - 解析字符串以生成谓词

c# - 尝试制作缩放效果

c# - COM 互操作、C#、Visual Studio 2010 -> 嵌入互操作类型

c# - 检查线程是否返回线程池

c# - 长日期时间转换为日期时间 C#