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

Fre*_*e2k 0 c# foreach dictionary list

循环遍历一组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];
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

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

不需要的分配

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

ang*_*son 6

你正在使用对象,这些被称为"引用类型",这意味着你有两件作品:

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

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

然后,将此引用分配给CSVFullColumnList每个下载案例的属性.你使副本参考,但不是对象.

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

你或许应该让第一循环中此对象的复制/克隆,并指定副本每个下载的情况下,这将使所有对象截然不同,改变一个不会改变的人.

但是现在,你只是改变了你拥有的一个对象,这使得你看起来像是在改变它们.