迭代集合并修改它的最佳实践?

Sea*_*son 1 c# collections foreach

我试图迭代一组项目,执行一个操作,然后删除当前索引处的项目.

我目前实现的方式是这样的:

foreach (CormantRadPane pane in GetPanes().ToList())
{
    pane.Clear();
    StateManager.Remove(pane);
    LayoutManager.Instance.RegisteredPanes.Remove(pane);
    Items.Remove(pane);
}
Run Code Online (Sandbox Code Playgroud)

通过调用ToList,我创建了一个集合的副本,但保留了对第一个集合中每个对象的引用.这允许我迭代GetPanes的集合返回,而无需"技术上"修改集合.

这显然很容易让一些人难以追查错误.以干净的方式执行此类逻辑的标准方法是什么,但是对于正在发生的事情的复杂性也更清楚?

我做了一些环顾四周,看到了诸如使用for循环并在列表中向后移动的东西,但这看起来真的很笨重.保持第二个项目列表"删除"然后在第一个循环完成后遍历该列表,删除第二个列表中找到的每个对象,我的感受大致相同.

你怎么处理它?谢谢.

Sae*_*iri 5

你可以创建一个变量并使用它来代替当前的方法,我建议使用for循环去除窗格,技巧只是反向迭代它:

var panes = GetPanes();
int count = panes.Count;
for(int i= count - 1; i>=0; i--)
{
       pane = panes[i];
       pane.Clear();
       StateManager.Remove(pane);
       LayoutManager.Instance.RegisteredPanes.Remove(pane);
       //Items.Remove(pane);
       Items.RemoveAt(i);
} 
Run Code Online (Sandbox Code Playgroud)

调用Items.Remove(pane);需要O(n)(如果是列表)但是在使用Items.RemoveAt(i);它的情况下需要O(1),所以你当前的方法需要O(n ^ 2),但如果你可以调用RemoveAt(索引)(你有一些列表和它们以相同的方式排序)你可以在O(n)中处理它.