c#foreach循环更新集合中的所有对象
在下载的Case对象集合上循环。目的是更新sorteddictionary(CSVFullColumnList),它作为每个downloadedCase对象上的属性存在 代码如下:c#foreach循环更新集合中的所有对象,c#,list,dictionary,foreach,C#,List,Dictionary,Foreach,在下载的Case对象集合上循环。目的是更新sorteddictionary(CSVFullColumnList),它作为每个downloadedCase对象上的属性存在 代码如下: private void generateCSVRows() { foreach (NewCase downloadedCase in downloadedCases) { downloadedCase.CSVFullColumnList = t
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];
}
}
}
}
private void generateCSVRows()
{
foreach(新案例下载案例中的案例下载)
{
downloaddedcase.CSVFullColumnList=this.columnsWithNoValuesFinal;
}
字符串columnNameLower;
foreach(新案例下载案例中的案例下载)
{
列表键=新列表(columnsWithNoValues.keys);
foreach(键中的字符串列名称)
{
columnNameLower=columnName.ToLower();
if(下载的case.CSVDataList.ContainsKey(columnNameLower))
{
downloadedCase.CSVFullColumnList[columnNameLower]=downloadedCase.CSVDataList[columnNameLower];
}
}
}
}
但是,当代码到达if语句中的赋值时,将针对所有下载的case对象完成赋值。例如,在第一次迭代中,集合中的第三个对象也会得到更新。此外,columnsWithNoValuesFinal也会得到更新,即使在赋值语句中没有为其赋值
有人能给我解释一下为什么会发生这种情况吗?您正在使用对象,这些对象被称为“引用类型”,这意味着您有两个方面在起作用:
- 对象本身
- 对对象的一个或多个引用
列swithnovaluesFinal
字段/变量引用
然后将此引用分配给每个下载案例的CSVFullColumnList
属性。您正在复制引用,但不是对象
因此,最终得到1个对象和多个引用
您可能应该在第一个循环中复制/克隆此对象,并将副本分配给每个已下载的案例,这将使所有对象彼此独立,更改其中一个不会更改其他对象
但是现在,你只是改变了你拥有的一个对象,这使它看起来像是你改变了“所有对象”。你在使用对象,这些对象被称为“引用类型”,这意味着你有两件事要做:
- 对象本身
- 对对象的一个或多个引用
列swithnovaluesFinal
字段/变量引用
然后将此引用分配给每个下载案例的CSVFullColumnList
属性。您正在复制引用,但不是对象
因此,最终得到1个对象和多个引用
您可能应该在第一个循环中复制/克隆此对象,并将副本分配给每个已下载的案例,这将使所有对象彼此独立,更改其中一个不会更改其他对象
但是现在,你只是改变了你拥有的一个对象,这使它看起来像你改变了“所有对象”。你很可能在所有对象上引用了相同的对象,这意味着你只有一个对象在游戏中。在第一个循环中,您很可能希望克隆分配给每个下载案例的
列novaluesFinal
,以确保每个案例都有自己的副本,可以单独修改。您很可能在所有案例上引用了相同的对象,这意味着您只有一个对象在使用中。在第一个循环中,您很可能希望克隆分配给每个下载案例的列novaluesFinal
,以确保每个案例都有自己的副本,可以单独修改。