我有类似的结构(但很多更复杂):
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;
吗?
答案 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();