在 C# 中用 children 循环

Loop with children in c#

我正在尝试在 c# 中修改 children 的 parents。 如您所知,在 foreach 中不可能这样做,为了更好地解释我的问题,这是我最初编写的代码:

foreach (GantLineItem proj in Tasks)
{
    foreach (GantLineItem jalOrMach in proj.Children)
    {
        if (jalOrMach.Children.Count > 0)
        {
            foreach (GantLineItem machOrServ in jalOrMach.Children)
            {
                if (machOrServ.Children.Count > 0)
                {
                    GanttView.ExpandCollapseService.CollapseItem(machOrServ);
                }
                //else     jalOrMach.Children.Remove(machOrServ);
            }
            GanttView.ExpandCollapseService.CollapseItem(jalOrMach);
        }
        //else proj.Children.Remove(jalOrMach);
    }
    GanttView.ExpandCollapseService.CollapseItem(proj);
}

所以,每次,我的else都无法执行。

为了解决这个问题,我尝试使用 for 循环来解决这个问题:

for (var i = 0; i < Tasks.Count; i++)
{
    for (var j = 0; j < Tasks[i].Children.Count; j++)
    {
        for (var k = 0; k < Tasks[i].Children[j].Children.Count; k++)
        {

        }
    }
    GanttView.ExpandCollapseService.CollapseItem(Tasks[i]);
}

但是在这里,我遇到了一个新问题,行

for (var k = 0; k < Tasks[i].Children[j].Children.Count; k++)

无法执行,"Count"在这种情况下是不可能执行的,为什么?

我假设最后的Children属性是IEnumerable<T>,所以解析的Count是LINQ扩展方法 Enumerable.Count。没有Count属性.

变化:

for (var k = 0; k < Tasks[i].Children[j].Children.Count; k++)

收件人:

for (var k = 0; k < Tasks[i].Children[j].Children.Count(); k++)

但是,为了使索引始终保持有效,您需要反向执行此操作。最简单的解决方案通常是克隆您正在迭代的集合。这不会导致错误,例如:

foreach (GantLineItem proj in Tasks.ToList())
{
    Tasks.Remove(proj);
}