C# 对象更改后更新列表中的对象

C# 对象更改后更新列表中的对象,c#,C#,我有一个对象列表,我在列表上做foreach,我将每个对象发送给一个方法,该方法修改对象并返回它;像这样: foreach (MyObjectModel o in TheMasterObject.ListOfMyObjectModel) { o = MyMethod(o); } 那不行。我要做的是用MyMethod返回的修改版本替换我正在迭代的对象 我需要改变什么 谢谢。你不能这样做。C#不允许修改foreach的迭代变量。最好的选择是保留一个辅助列表,将修改后的值放入其中,然后替换初始列

我有一个对象列表,我在列表上做foreach,我将每个对象发送给一个方法,该方法修改对象并返回它;像这样:

foreach (MyObjectModel o in TheMasterObject.ListOfMyObjectModel)
{
  o = MyMethod(o);
}
那不行。我要做的是用MyMethod返回的修改版本替换我正在迭代的对象

我需要改变什么


谢谢。

你不能这样做。C#不允许修改
foreach
的迭代变量。最好的选择是保留一个辅助列表,将修改后的值放入其中,然后替换初始列表。或者,如果您的数据结构允许直接索引,您可以将
foreach
替换为
for
,然后您将能够直接分配对象。

您无法重新分配循环变量,并且重新分配变量不会影响列表中的对象。如果需要在列表中的对象上写入,请使用
for
循环

for (int index = 0; index < list.Count; index++)
{
     var obj = list[index];
     list[index] = MyMethod(obj);
}
for(int index=0;index
如果
MyObjectModel
是一个类(而不是结构),则无需重新分配它。类是引用类型,这意味着您的方法将获得指向集合中对象的指针。您在方法中所做的任何修改都将在列表中的实际对象上进行。你不需要更换它

如果返回的是一个全新的对象,请按照Anthony Pegram的建议执行。

for(int i=0;ifor (int i =0; i < TheMasterObject.ListOfMyObjectModel.size(); ++i) {
    TheMasterObject.ListOfMyObjectModel.set(i, MyMethod(TheMasterObject.ListOfMyObjectModel.get(i)));
}
masterobject.ListOfMyObjectModel.set(i,MyMethod(TheMasterObject.ListOfMyObjectModel.get(i)); }
我是用java思想写这篇文章的,如果需要对C#进行一些更改,那么请随意使用for循环而不是迭代器

for (int i = 0; i < objectModels.Count; i++) {
  objectModels[i] = MyMethod(objectModels[i]);
}
for(int i=0;i
至于原因,这个问题解释了这一点:

希望这有帮助
Y

此线程的可能重复将解释为什么不能按最初尝试的方式为..每个
循环使用
,如果我想从列表中删除obj怎么办?这是一个单独的问题,请在上面查找重复项。但我建议的答案是向后循环列表,并使用
RemoveAt
方法。可能看起来像
for(int index=list.Count-1;index>=0;index--){list.RemoveAt(index);}
,或者您只需使用
RemoveAll
而不使用循环,并为删除条件传入委托或lambda表达式。