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循环并在列表中向后移动的东西,但这看起来真的很笨重.保持第二个项目列表"删除"然后在第一个循环完成后遍历该列表,删除第二个列表中找到的每个对象,我的感受大致相同.
你怎么处理它?谢谢.
你可以创建一个变量并使用它来代替当前的方法,我建议使用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)中处理它.
归档时间: |
|
查看次数: |
1770 次 |
最近记录: |