C# 关于递归方法设计的建议

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

例如,我有一个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 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;

    }