2012-02-15 3 views
1

У меня есть класс 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? 
    } 
} 

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

Любые элегантные идеи оценили?

Благодаря

+0

Что было бы вашим наивным подходом? – Dykam

+0

Существует ли какое-либо отношение между длительностью подзадач родительской задаче, например. зависят они друг от друга или если продолжительность родительской задачи уже содержит продолжительность всех дочерних задач? – Dominik

+0

Это была бы еще одна проблема, просто захотеть сначала свернуть рекурсию. Но чтобы ответить на ваш вопрос Время начала/окончания родительского времени будет минимальным/максимальным. – Fixer

ответ

8

Я просто сделать:

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

    return GetDuration(); 
} 

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

Редактировать: обрабатывать случай, когда SubTasks имеет значение NULL (через ответ Kristof).

+1

Это будет работать, даже если подзадачи имеют 10 уровней глубины? – Fixer

+0

Я писал тот же ответ, но @Jackson Pope был быстрее ... По-моему, это лучший и самый простой способ добиться этого. Рекурсивные данные должны быть решены с помощью рекурсии. Он может обрабатывать любое количество уровней вложенности. – ramsesoriginal

+0

@ Фиксер: Да, так и будет. В конце концов, он переполнит стек, но вам нужно будет пройти как минимум сотни уровней, прежде чем это произойдет. –

2
public TimeSpan GetTotalDuration() 
    { 
     var duration = GetDuration(); 
     if(SubTasks != null && SubTasks.Count > 0) 
     { 
      foreach (var t in SubTasks) 
      { 
       duration += t.GetTotalDuration(); 
      } 
     } 
     return duration; 

    } 
+0

Спасибо за ваш ввод +1. – Fixer