繁体   English   中英

C#foreach循环更新集合中的所有对象

[英]c# foreach loop updating all objects in collection

循环遍历一组downloadCase对象。 目的是更新一个排序字典( CSVFullColumnList ),该字典作为属性存在于每个downloadedCase对象上。

代码如下:

    private void generateCSVRows()
    {
        foreach (NewCase downloadedCase in downloadedCases)
        {
            downloadedCase.CSVFullColumnList = this.columnsWithNoValuesFinal;
        }
        string columnNameLower;
        foreach (NewCase downloadedCase in downloadedCases)
        {
            List<string> keys = new List<string>(columnsWithNoValues.Keys);
            foreach (string columnName in keys)
            {
                columnNameLower = columnName.ToLower();
                if (downloadedCase.CSVDataList.ContainsKey(columnNameLower))
                {
                    downloadedCase.CSVFullColumnList[columnNameLower] = downloadedCase.CSVDataList[columnNameLower];
                }
            }
        }
    }

但是,当代码到达if语句内的赋值时,将针对所有downloadedCase对象完成赋值。 例如,在第一次迭代中,集合中的第三个对象也被更新。 此外,即使在assignment语句中未为其分配任何内容, columnsWithNoValuesFinal也将得到更新。

不需要的作业

有人可以向我解释为什么会这样吗?

您正在使用对象,这些对象称为“引用类型”,这意味着您在玩两个游戏:

  • 对象本身
  • 对对象的一个​​或多个引用

在这种情况下,您有1个对象,该对象最初由columnsWithNoValuesFinal字段/变量引用。

然后,将此引用分配给每个下载案例的CSVFullColumnList属性。 您正在复制参考 ,但不是 对象

因此,您最终得到1个对象和许多引用。

您可能应该在第一个循环内对该对象进行复制/克隆,然后将副本分配给每个已下载的案例,这将使所有对象彼此独立,更改一个对象不会更改其他对象。

但是现在,您只需要更改一个对象,就可以更改“全部”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM