2014-10-03 6 views
0

Вот моя рекурсивная функция, чтобы получить новый город в коллекцию.Рекурсивная функция, не зацикливающая всех детей

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»; line - и вы узнаете, почему вы получаете null. Вы потеряли значение, которое было возвращено «getNewlyAddedCity (city.Children)»; вызов. – TSV

+0

@TSV Я сохранил эти точки останова и проверил его. Но моя рекурсивная функция проходит через только ParentCities. – Vishal

+0

Если всегда есть город, у которого есть 'IsLastAdded == true', то, очевидно, ваш код не перейдет к рекурсивному вызову' getNewlyAddedCity (city.Children) '. – Krumia

ответ

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

+0

Спасибо за ваше время и помощь. – Vishal

+0

@Vishal ok :) без проблем – TSV

2

Вы отбрасываете возвращаемое значение getNewlyAddedCity(city.Children);. В результате после цикла функция вернет null.

Вы можете сделать это:

return getNewlyAddedCity(city.Children); 

Кроме того, оказывается, что вы хотите получить «последний добавленный город». Поскольку вы уже используете ObservableCollection<T>, почему бы вам не подумать об использовании CollectionChanged event?

+0

Я попробовал вернуть ключевое слово, как вы предложили. Затем функция не проходит цикла и просто проверяет IsLastAdded в первом городе и в зависимости от того, что она возвращает вызывающему. – Vishal

+0

Тогда 'IsLastAdded' в первом городе' истина'. Проверьте свою логику, когда вы устанавливаете 'IsLastAdded' на объекты' City'. – Krumia

+0

IsLastAdded on first city is false – Vishal

1

Вы не должны

return getNewlyAddedCity(city.Children); 

InstEd просто назвав его?

+0

Я попробовал вернуть ключевое слово, как вы предложили.Затем функция не проходит цикла и просто проверяет IsLastAdded в первом городе и в зависимости от того, что она возвращает вызывающему. – Vishal

+0

Да, как сказал Крумия, может быть, у первого есть набор IsLastAdded. Также обратите внимание, что если city.Children == null, ваш код будет сбой, потому что вы зацикливаете это независимо. –

+0

Глупый меня, TSV понял. –

Смежные вопросы