c# - 递归计算任务的子任务
问题描述
我如何计算任务的子任务并计算其中完成了多少?任何子任务都可以有很多子任务,我们应该只计算最低级别的任务的子任务(没有更多的子任务)。(当所有子任务都完成后,任务就准备好了。但这只是解释,所有任务都知道自己是否准备好了)
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);
}
}
解决方案
像这样的东西怎么样
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);
}
}
?
推荐阅读
- sql-server - 失败时不会抛出错误。我在 SQL 代理作业中运行它
- amazon-web-services - 取消选中“使用 lambda 代理集成”cloudformation
- firebase - 如何为 Firestore 查询创建自定义索引
- git - 我的旧 git 提交未显示在 BitBucket 上,被其他人覆盖
- node.js - 使用对话流保存到两个不同的 Firestore 数据库
- python - 类型错误:尝试使用 get_dummies 进行一对一热编码时,列表索引必须是整数或切片,而不是 str
- java - 如何格式化我的数字以使其与右侧对齐?
- azure - 从 App Insights 警报中验证对用 Azure 函数编写的 webhook 的调用
- html - 如何将页脚带到页面底部?
- c# - 为 SSO 获取 Kerberos 令牌