【问题标题】:c# foreach loop updating all objects in collectionc# foreach 循环更新集合中的所有对象
【发布时间】:2016-05-15 11:19:39
【问题描述】:

循环遍历 downloadedCase 对象的集合。目的是更新作为属性存在于每个 downloadedCase 对象上的 sorteddictionary (CSVFullColumnList)。

代码如下:

    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 对象完成。例如,在第一次迭代时,集合中的第三个对象也会更新。此外,即使在赋值语句中没有分配任何内容,columnsWithNoValuesFinal 也会更新。

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

【问题讨论】:

  • 你很可能在它们上都引用了同一个对象,这意味着你只有一个对象在玩。您很可能希望在第一个循环中克隆分配给每个下载案例的columnsWithNoValuesFinal,以确保每个案例都有自己的副本,可以单独修改。

标签: c# list dictionary foreach


【解决方案1】:

您正在使用对象,这些被称为“引用类型”,这意味着您有两个部分在起作用:

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

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

然后将此引用分配给每个下载案例的CSVFullColumnList 属性。您正在制作 reference 的副本,但 不是 object

所以你最终得到了 1 个对象和许多引用。

您可能应该在第一个循环中制作此对象的副本/克隆,并将副本分配给每个下载的案例,这将使所有对象不同且分开,更改一个不会更改其他对象。

但是现在,你只是改变了你拥有的一个对象,这看起来就像你改变了“他们全部”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    • 2018-12-25
    • 2016-08-13
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多