添加到列表会覆盖C#中以前的对象值

本文关键字:对象 列表 覆盖 添加 | 更新日期: 2023-09-27 18:27:46

尽管Stackoverflow上有几篇关于这类问题的帖子,但我已经仔细查看了它们,还没有找到解决问题的方法。

在代码中,我将使用foreach循环遍历一个列表列表,并将创建的元素添加到另一个列表中。尽管在foreach循环中,每个迭代都给出一个唯一的值,但在它之外的值是相同的。

try
{
    List<Takeoff> takeoffs = new List<Takeoff>();
    List<List<String>> itemTable = queryTable("TK_ITEM", 52);
    foreach (List<String> row in itemTable)
    {
        // Second element in the constructor is Name.
        Takeoff takeoff = new Takeoff(row.ElementAt(0), row.ElementAt(3), row.ElementAt(11), 
            row.ElementAt(17), row.ElementAt(25), row.ElementAt(33), 
            row.ElementAt(37), row.ElementAt(45));
        MessageBox.Show(row.ElementAt(3)); // Each iteration gives an unique value.
        takeoffs.Add(takeoff);
    }
    // Values of both objects are the same.
    MessageBox.Show(takeoffs[0].Name);
    MessageBox.Show(takeoffs[1].Name);
    return takeoffs;
}
catch (Exception)
{
    MessageBox.Show("No material takeoff created!", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    return null;
}

我尝试了各种添加和显示值的方法,但到目前为止,我还没有找到一个可行的解决方案。

有人能告诉我问题出在哪里吗?

编辑:起飞声明

/*...*/
private static string name;
/*...*/
public Takeoff(string id, string name, string guid, string width, string height, string area, string volume, string count)
{
    /*...*/
    Name = name;
    /*...*/
}
/*...*/
public string Name
{
    get { return name; }
    set { name = value; }
}
/*...*/

添加到列表会覆盖C#中以前的对象值

您的name后台字段是静态的:

private static string name;

不要那样做。只需删除static修饰符,就没有必要了。

静态成员属于类型,而不是实例。这意味着Takeoff的所有实例共享相同的name值,无论最后指定哪个值。