首页 > 解决方案 > 递归计算任务的子任务

问题描述

我如何计算任务的子任务并计算其中完成了多少?任何子任务都可以有很多子任务,我们应该只计算最低级别的任务的子任务(没有更多的子任务)。(当所有子任务都完成后,任务就准备好了。但这只是解释,所有任务都知道自己是否准备好了)

Task1             (not done)
  SubTask1a        (not done)
     SubTask1a_1  (done)       <-- lowest level
     SubTask1a_2  (not done)   <-- lowest level
  SubTask1b       (not done)   <-- lowest level

所以在这个例子中 Task1 有 3 个 SubTasks 并且只完成了一个。

我设法迭代了所需的项目,但无法计算子任务的总和以及完成了多少。

var tasks = new List<Task>()
            {
                new Goal(){ Id=1, Name="Task1" ,ParentId=0, Done=false},
                new Goal(){ Id=2, Name="SubTask1a" ,ParentId=1, Done=false},
                new Goal(){ Id=3, Name="SubTask1a_1" ,ParentId=2, Done=true},
                new Goal(){ Id=4, Name="SubTask1a_2" ,ParentId=2, Done=false},
                new Goal(){ Id=5, Name="SubTask1b" ,ParentId=1, Done=false},
            };
Walk(1);

void Walk(int Id)
{
  var children = goals.Where(c => c.ParentId.Equals(Id)).ToList();
  foreach (var item in children)
  {
    Walk(item.Id);
  }
}

标签: c#recursion

解决方案


像这样的东西怎么样

  bool Done(Goal goal)
  {
    var children = goals.Where(c => c.ParentId.Equals(goal.Id)).ToList();
    if (children.Count == 0)
    {
      return goal.Done;
    }
    else
    {
      int itemCount = 0;
      int doneCount = 0;
      foreach (var item in children)
      {
        itemCount++;
        if (Done(item))
          doneCount++;
      }
      return (doneCount == itemCount);
    }
  }

?


推荐阅读