修改foreach循环内的列表

时间:2011-06-09 15:03:42

标签: c# list foreach

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

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 ..
    }
}

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

3 个答案:

答案 0 :(得分:34)

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

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

foreach(var item in list.ToList())

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

答案 1 :(得分:27)

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

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

}

答案 2 :(得分:3)

如果不知道正在进行哪种编辑,很难提供有用的建议。但是,我发现的模式具有最通用的价值,只是构建一个新的列表。

例如,如果你需要查看每个项目并决定删除它,保持原样,或者在它之后插入项目,你可以使用这样的模式:

IEnumerable<string> butcherTheList(IEnumerable<string> input)
{
    foreach (string current in input)
    {
        if(case1(current))  
        {
            yield return current;
        }
        else if(case2(current))
        {
            yield return current;
            yield return someFunc(current);
        }
        // default behavior is to yield nothing, effectively removing the item
    }
}

List<string> newList = butcherTheList(input).ToList();