2012-02-15 68 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? 
    } 
} 

子任務可以是幾個級別深,現在沒有邏輯限制。我不確定如何設計負責散步子任務的方法並累積TimeSpan值?

任何優雅的想法讚賞?

感謝

+0

什麼是你的天真方法? – Dykam 2012-02-15 10:47:10

+0

子任務的持續時間與父任務之間是否有任何關係他們是互相依賴還是應該在父任務的持續時間內包含所有子任務的持續時間? – Dominik 2012-02-15 10:48:42

+0

這將是另一個問題,只是想首先確定遞歸。但要回答你的問題父母的開始/結束時間將是子任務日期的最小/最大值。 – Fixer 2012-02-15 10:56:21

回答

8

我只是做:

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

    return GetDuration(); 
} 

使用LINQ。

編輯:處理SubTasks爲null的情況(通過Kristof的回答)。

+1

即使子任務深度達到10級,這也可以工作。 – Fixer 2012-02-15 10:54:31

+0

我寫了同樣的答案,但@傑克遜教皇更快......在我看來,這是實現它的最好和最簡單的方法。遞歸數據應該用遞歸來解決。它可以處理任何級別的嵌套。 – ramsesoriginal 2012-02-15 10:55:41

+0

@Fixer:是的,它會的。它最終會堆棧溢出,但在這種情況發生之前,你至少需要去上百個關卡。 – 2012-02-15 10:57:35

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 2012-02-15 11:02:21