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

时间:2016-02-05 12:57:32

标签: c# list dictionary foreach

循环遍历 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 也会更新。

Unwanted Assignment

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

1 个答案:

答案 0 :(得分:6)

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

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

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

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

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

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

但是现在,你只是改变了你拥有的一个对象,这看起来就像是你改变了所有对象。