我有一个对象列表,我在列表上做了一个foreach,我将每个对象发送到一个修改对象并返回它的方法;像这样:
foreach (MyObjectModel o in TheMasterObject.ListOfMyObjectModel)
{
o = MyMethod(o);
}
这不起作用。我想要做的是用MyMethod返回的修改版本替换我正在迭代的对象。
我需要改变什么?
感谢。
答案 0 :(得分:3)
您无法重新分配循环变量,无论如何重新分配变量都不会影响列表中的对象。如果需要在列表中写入对象,请使用for
循环。
for (int index = 0; index < list.Count; index++)
{
var obj = list[index];
list[index] = MyMethod(obj);
}
答案 1 :(得分:2)
你不能这样做。 C#不允许修改foreach
的迭代变量。您最好的选择是保存辅助列表并将修改后的值放在那里,然后替换初始列表。或者,如果您的数据结构允许直接建立索引,则可以将foreach
替换为for
,然后您就可以直接分配对象。
答案 2 :(得分:0)
如果MyObjectModel
是一个类(不是结构),那么您不需要重新分配它。类是引用类型,这意味着您的方法将获得指向集合中对象的指针。您在方法中所做的任何修改都将在列表中的实际对象上完成。你不需要更换它。
如果你回来是一个全新的对象,那就去做Anthony Pegram的建议吧。
答案 3 :(得分:0)
for (int i =0; i < TheMasterObject.ListOfMyObjectModel.size(); ++i) {
TheMasterObject.ListOfMyObjectModel.set(i, MyMethod(TheMasterObject.ListOfMyObjectModel.get(i)));
}
我是用java思考写的,如果有些更改需要让它在C#上工作,那就是我的客人
答案 4 :(得分:0)
使用for循环而不是迭代器。
for (int i = 0; i < objectModels.Count; i++) {
objectModels[i] = MyMethod(objectModels[i]);
}
至于原因,这个问题解释了它: Why is the iteration variable readonly
希望这会有所帮助 ÿ