修改foreach循环内的列表

Ent*_*ity 17 c# foreach list

我有一个类似的结构(但很多更复杂的):

var list = new List<string>();

// .. populate list ..

foreach(var item in list)
{
    DoFunction(list);
}

public void DoFunction(List<string> list)
{
    if(someCondition == true)
    {
        // .. modify list in here ..
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我明白它不可能编辑你正在进行的集合,但如果你必须编辑列表(没有try catch声明),你如何优雅地跳出循环?有没有办法判断列表是否已被编辑?您可以在break;注意到之前快速编辑列表吗?

Str*_*ior 34

是的,你可以打破,如果这是你真正想要的.在for循环尝试从列表中获取下一个项目之前,不会抛出异常.

但我发现最简单的方法是创建并遍历列表副本,这样您就不用担心了.

foreach(var item in list.ToList())
Run Code Online (Sandbox Code Playgroud)

与更复杂代码的可维护性成本相比,额外的未触及列表的额外性能开销通常可以忽略不计.

  • @TheAdamGaskins:不,`list.ToList()`在`for`循环的开头被评估一次,并且只创建原始列表的直接副本.该副本用于迭代,而原始列表是添加和删除项目的列表. (2认同)

Fos*_*sco 27

循环不允许使用foreach构造,而是for允许您更改列表.

for (var x = 0; x < list.Count; x++) {

}
Run Code Online (Sandbox Code Playgroud)

  • 这可能变得非常棘手,具体取决于对原始列表进行了哪些修改.如果删除在遍历列表时找到的项目,则必须适当修改"x"值以避免错误. (4认同)
  • @StriplingWarrior它并不难.只做`x - `,你删除后就没事了 (2认同)
  • 我取决于他的DoFunction有多复杂.如果他从列表中移除*其他*项目(除了"x"处的项目),那么他将必须确定这些项目是在当前位置之前还是之后.我不是说它不能做 - 它变得足够复杂,在许多情况下它是不值得的. (2认同)