C# 关于递归方法设计的建议
例如,我有一个Task类,它可以报告完成一项任务需要多长时间。但是,此类可以包含相同类型的子任务C# 关于递归方法设计的建议,c#,design-patterns,recursion,C#,Design Patterns,Recursion,例如,我有一个Task类,它可以报告完成一项任务需要多长时间。但是,此类可以包含相同类型的子任务 public class Task { public string Name{get; set;} public DateTime Start {get; set;} public DateTime Finish {get; set;} public List<Task> SubTasks {get; set;} public TimeSpan
public class Task
{
public string Name{get; set;}
public DateTime Start {get; set;}
public DateTime Finish {get; set;}
public List<Task> SubTasks {get; set;}
public TimeSpan GetDuration()
{
return Finish - Start;
}
public TimeSpan GetTotalDuration()
{
//How?
}
}
子任务可以有几个层次,目前没有逻辑限制。我不确定如何设计负责遍历子任务并累积时间跨度值的方法
有什么好主意吗
谢谢我只想:
public TimeSpan GetTotalDuration()
{
if (SubTasks != null)
return GetDuration() + SubTasks.Sum(t => t.GetTotalDuration());
return GetDuration();
}
使用Linq
编辑:通过Kristof的回答处理子任务为空的情况。我只需要做:
public TimeSpan GetTotalDuration()
{
if (SubTasks != null)
return GetDuration() + SubTasks.Sum(t => t.GetTotalDuration());
return GetDuration();
}
public TimeSpan GetTotalDuration()
{
var duration = GetDuration();
if(SubTasks != null && SubTasks.Count > 0)
{
foreach (var t in SubTasks)
{
duration += t.GetTotalDuration();
}
}
return duration;
}
使用Linq
编辑:通过Kristof的回答来处理子任务为空的情况。您最天真的方法是什么?子任务的持续时间与父任务之间是否存在任何关系,例如,它们是否相互依赖,或者父任务的持续时间是否已经包含所有子任务的持续时间?这将是另一个问题,只想先确定递归。但要回答您的问题,父任务的开始/完成时间将是子任务日期的最小/最大值。您的天真方法是什么?子任务的持续时间与父任务的持续时间之间是否存在任何关系,例如,它们是否相互依赖,或者父任务的持续时间是否已经包含所有子任务的持续时间?这将是另一个问题,只需先确定递归。但要回答您的问题,家长开始/完成时间将是子任务日期的最小/最大值。我写的是相同的答案,但@Jackson Pope更快。。。在我看来,这是实现这一目标的最好和最简单的方法。递归数据应该用递归来解决。它可以处理任意级别的嵌套。@Fixer:是的,它可以。它最终会导致堆栈溢出,但在发生这种情况之前,您至少需要经历数百个级别。这很好,从表面上看,它看起来只是在子任务的第一个级别上进行迭代。@Fixer,它在子任务上调用相同的方法,因此它也将查看它们的子任务。它总结每个任务的GetTotalDuration。GetTotalDuration方法使用GetDuration,然后递归地求和另一个GetTotalDuration。所以这段代码很棒。干得好杰克逊:我写了同样的答案,但是@Jackson Pope写得更快。。。在我看来,这是实现这一目标的最好和最简单的方法。递归数据应该用递归来解决。它可以处理任意级别的嵌套。@Fixer:是的,它可以。它最终会导致堆栈溢出,但在发生这种情况之前,您至少需要经历数百个级别。这很好,从表面上看,它看起来只是在子任务的第一个级别上进行迭代。@Fixer,它在子任务上调用相同的方法,因此它也将查看它们的子任务。它总结每个任务的GetTotalDuration。GetTotalDuration方法使用GetDuration,然后递归地求和另一个GetTotalDuration。所以这段代码很棒。干得好,杰克逊:
public TimeSpan GetTotalDuration()
{
var duration = GetDuration();
if(SubTasks != null && SubTasks.Count > 0)
{
foreach (var t in SubTasks)
{
duration += t.GetTotalDuration();
}
}
return duration;
}