C# 通过方法更改foreach中的项目

C# 通过方法更改foreach中的项目,c#,methods,foreach,C#,Methods,Foreach,让我们从以下片段开始: Foreach(Record item in RecordList){ .. item = UpdateRecord(item, 5); .. } updateCode函数更改item的某些字段并返回更改后的对象。在这种情况下,编译器抛出一个异常,表示该项不能在foreach迭代中更新 现在,UpdateRecord方法已更改,因此它将返回void,代码段如下所示: Foreach(Record item in RecordList){ .. Upd

让我们从以下片段开始:

Foreach(Record item in RecordList){
  ..
  item = UpdateRecord(item, 5);
  ..
}
updateCode函数更改item的某些字段并返回更改后的对象。在这种情况下,编译器抛出一个异常,表示该项不能在foreach迭代中更新

现在,UpdateRecord方法已更改,因此它将返回void,代码段如下所示:

Foreach(Record item in RecordList){
  ..
  UpdateRecord(item, 5);
  ..
}
在这种情况下,项目将被更新,因为记录是引用类型。但它使代码无法读取


我正在处理的项目有很多foreach循环,它们反复使用几乎相同的代码,所以我想创建一些方法来更新部分记录。有什么好办法吗?使代码更具可读性而不是进一步破坏它的方法?

如果需要更新集合,不要使用迭代器模式,就像您所说的那样,它要么容易出错,要么味道不好


我发现在这种情况下,使用带有索引的for循环会更清晰一些,因为很明显,您正试图用这种方式来做什么。

是否需要更新相同的列表?是否可以返回一个新的(更新的)枚举

foreach(Record item in RecordList){
  ..
  yield return GetUpdatedRecord(item, 5);
  ..
}

编译器抱怨您无法更新集合,而不是记录。通过执行item=UpdateRecord,可以重新分配迭代器变量item

我不同意UpdateRecord(第5项)在任何方面都是不可读的,但如果它让您感觉更好,扩展方法可能会更清楚地表明您正在更改第5项的内容

static void Update(this Record item, int value) {
   // do logic
}

foreach (Record item in RecordList) {
   item.Update(5);
}

谢谢,我认为这是在我的情况下唯一正确的方法。使用迭代器模式更新集合中的项绝对没有错。您不想在迭代时从集合中添加或删除项,这正是编译器所抱怨的。谢谢您的评论。就我而言,收益率不是一个选项。但我会记住的,它可能是有用的。。。