Советы по дизайну рекурсивного метода - PullRequest
1 голос
/ 15 февраля 2012

Например, у меня есть класс 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?
    }
 }

Подзадачи могут быть на нескольких уровнях, логического ограничения сейчас нет. Я не уверен, как разработать метод, отвечающий за обход подзадач и накапливать значение TimeSpan?

Любые изящные идеи оценены?

Спасибо

Ответы [ 2 ]

8 голосов
/ 15 февраля 2012

Я бы просто сделал:

public TimeSpan GetTotalDuration()
{
    if (SubTasks != null)
        return GetDuration() + SubTasks.Sum(t => t.GetTotalDuration()); 

    return GetDuration();
}

Использование Linq.

Редактировать: для обработки случая, когда подзадачи нулевые (через ответ Кристофа).

2 голосов
/ 15 февраля 2012
public TimeSpan GetTotalDuration()
    {
        var duration = GetDuration();
        if(SubTasks != null && SubTasks.Count > 0)
        {
            foreach (var t in SubTasks)
            {
                duration += t.GetTotalDuration();
            }   
        }
        return duration;

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...