2014-10-03 113 views
0

這裏是我的遞歸函數,以獲得新增城市的heirarchical集合。遞歸函數沒有循環遍歷所有的孩子

private City getNewlyAddedCity(ObservableCollection<City> cities) 
{ 

    foreach (var city in cities) 
    { 
     if (city.IsLastAdded) 
     { 
      return city; 
     } 
     getNewlyAddedCity(city.Children); 
    } 

    return null; 

} 

我這樣調用函數:

City newlyAddedCity = getNewlyAddedCity(ServiceLocator.Instance.Cities); 

每次newlyAddedCity爲空。

如果我把一個斷點和檢查,那麼有一個城市有IsLastAdded = true

我也檢查過使用斷點,此功能不循環集合中的所有城市。

+1

設置2個斷點 - 一個在「返回城市」;行,另一個 - 在「返回null」行 - 你會發現爲什麼你會得到空。你失去了「getNewlyAddedCity(city.Children)」返回的價值;「呼叫。 – TSV 2014-10-03 06:21:14

+0

@TSV我保留了這些斷點並檢查了它。但我的遞歸函數只循環通過ParentCities。 – Vishal 2014-10-03 06:24:38

+0

如果總有一個城市擁有'IsLastAdded == true',那麼顯然你的代碼不會去遞歸調用'getNewlyAddedCity(city.Children)'。 – Krumia 2014-10-03 06:27:46

回答

1
private City getNewlyAddedCity(ObservableCollection<City> cities) { 
    City result = null; 
    foreach(var city in cities) { 
     if(city.IsLastAdded) { return city; } 
     result = getNewlyAddedCity(city.Children); 
     if(result != null) { break; } 
    } 
    return result; 
} 
+0

此代碼在進行微小更改後正常工作。我將在您的答案中編輯這些更改。 – Vishal 2014-10-03 06:44:58

+0

感謝您的時間和幫助。 – Vishal 2014-10-03 06:48:32

+0

@Vishal ok :)沒問題 – TSV 2014-10-03 06:48:55

2

您將丟棄getNewlyAddedCity(city.Children);的返回值。因此,循環後函數將返回null

你可以這樣做:

return getNewlyAddedCity(city.Children); 

而且,看來,你想要得到的「最後添加的城市」。既然您已經使用ObservableCollection<T>,爲什麼不考慮使用CollectionChanged event

+0

我已經嘗試過按照你的建議返回關鍵字。然後函數不會循環,只檢查第一個城市中的IsLastAdded,並根據它返回給調用者。 – Vishal 2014-10-03 06:26:59

+0

然後在第一個城市'IsLastAdded'是'true'。檢查你在「城市」對象上設置「IsLastAdded」的邏輯。 – Krumia 2014-10-03 06:30:33

+0

IsLastAdded在第一個城市是假的 – Vishal 2014-10-03 06:35:07

1

你不應該

return getNewlyAddedCity(city.Children); 

insted的只是打電話呢?

+0

我已經按照你的建議嘗試了返回關鍵字。然後函數不會循環,只檢查第一個城市中的IsLastAdded,並根據它返回給調用者。 – Vishal 2014-10-03 06:27:35

+0

是的,就像Krumia說的那樣,可能是第一個有IsLastAdded集合。還要注意,如果city.Children == null,你的代碼將會崩潰,因爲不管循環如何。 – 2014-10-03 06:33:20

+0

傻了,TSV說得沒錯。 – 2014-10-03 06:47:59