C# 递归函数没有遍历所有子函数

C# 递归函数没有遍历所有子函数,c#,recursion,C#,Recursion,这是我的递归函数,用于将新添加的城市添加到heirarchical集合 private City getNewlyAddedCity(ObservableCollection<City> cities) { foreach (var city in cities) { if (city.IsLastAdded) { return city; } getNewlyAddedCity

这是我的递归函数,用于将新添加的城市添加到heirarchical集合

private City getNewlyAddedCity(ObservableCollection<City> cities)
{

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

    return null;

}
每次
newlyAddedCity
都为空

如果我放置一个断点并进行检查,那么有一个城市的IsLastAdded=true


我还使用断点检查了该函数是否不会在集合中的所有城市中循环。

您正在丢弃
getNewlyAddedCity(city.Children)的返回值。因此,在循环之后,函数将返回
null

private City getNewlyAddedCity(ObservableCollection<City> cities)
{

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

    return null;

}
您可以这样做:

return getNewlyAddedCity(city.Children);

此外,您似乎希望获得“最后添加的城市”。既然您已经使用了,为什么不考虑使用?

您丢弃<代码> GeNeXelayDeDead城市(城市儿童)的返回值;代码>。因此,在循环之后,函数将返回
null

您可以这样做:

return getNewlyAddedCity(city.Children);
此外,您似乎希望获得“最后添加的城市”。既然你已经用过了,为什么不考虑使用?

你不应该

return getNewlyAddedCity(city.Children);
你不应该只是叫它吗

return getNewlyAddedCity(city.Children);
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;
}
而不是仅仅称之为私人城市getNewlyAddedCity(可观察的集合城市){
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;
}
城市结果=空; foreach(城市中的var城市){ if(city.IsLastAdded){return city;} 结果=getNewlyAddedCity(city.Children); 如果(result!=null){break;} } 返回结果; }
私人城市新建城市(可观测收集城市){
城市结果=空;
foreach(城市中的var城市){
if(city.IsLastAdded){return city;}
结果=getNewlyAddedCity(city.Children);
如果(result!=null){break;}
}
返回结果;
}


设置两个断点—一个在“return city;”行,另一个在“return null;”行—然后您将了解得到null的原因。您丢失了“getNewlyAddedCity(city.Children);”调用返回的值。@TSV我保留了这些断点并进行了检查。但是我的递归函数只遍历父城市。如果总有一个城市的IsLastAdded==true,那么很明显,你的代码不会转到递归调用getNewlyAddedCity(city.Children)。类似这样的东西:private city getNewlyAddedCity(ObservableCollection cities){var result=null;foreach(var city in cities){if(city.IsLastAdded){return city;}result=getNewlyAddedCity(city.Children);if(result){break;}return result;}我假设树中只有“lastaddcity”。设置两个断点,一个在“return city;”行,另一个在“return null”行-您将了解为什么会得到null。您丢失了“getNewlyAddedCity(city.Children);”返回的值调用。@TSV我保留了这些断点并检查了它。但是我的递归函数只在父城市中循环。如果总有一个城市的IsLastAdded==true,那么很明显你的代码不会进入递归调用
getNewlyAddedCity(city.Children)
。类似这样的东西:private city getNewlyAddedCity(ObservableCollection cities){var result=null;foreach(var city in cities){if(city.IsLastAdded){return city;}result=getNewlyAddedCity(city.Children);if(result){break;}return result;}我假设“lastaddcity”是树中唯一的。我已尝试按您的建议使用return关键字。然后,函数不会循环,只会检查第一个城市中的IsLastAdded,并根据它返回给调用者。然后,第一个城市上的IsLastAdded
true
。检查您在
city
上设置的逻辑>在第一个城市中,ISLAST添加到FalSEOK。<代码> ISLASTATED < /COD>父集合中某个对象的属性必须是“代码>真值<代码>。否则它将进入递归函数。您可能不期望它,但是<代码>锡蒂< /代码>对象具有<代码> ISLASTATED < /COD> >真的可以位于集合的中间。。请检查是否是这样。感谢您的时间和帮助。我已按照您的建议尝试了return关键字。然后,函数不循环,只检查第一个城市中的IsLastAdded,并根据它返回给调用方。然后第一个城市上的
IsLastAdded
true
。检查设置
IsLastAdded的逻辑
City
对象上的d
。第一个City上的IsLastAdded为false OK。父集合中某些对象的
IsLastAdded
属性必须为
true
。否则它将进入递归函数。您可能不希望看到它,但可能找到了具有
IsLastAdded
true的
City
对象在集合的中间。请检查它是否是这样。谢谢你的时间和帮助。我已经试过了你建议的返回关键字。然后函数不循环,只检查第一个城市中的ISLASTAd,并根据它返回给调用者。是的,正如Krumia所说,可能第一个有ISLASTATED SET。如果city.Children==null,您的代码将崩溃,因为您正在循环。感谢您的时间和帮助。我已经按照您的建议尝试了return关键字。然后函数不会循环,只检查第一个城市中的IsLastAdded,这取决于它返回给调用方。是的,正如Krumia所说,第一个城市可能有IsLastAdded set。还请注意,如果city.Children==null,则您的代码将崩溃,因为您正在循环该设置。感谢您的时间和帮助。此代码在进行微小更改后工作正常。我将在您的答案中编辑这些更改。感谢您的时间和帮助。@Vishal ok:)没问题这段代码在做了一些小改动后运行良好。我将在您的答案中编辑这些改动。谢谢您的时间和帮助。@Vishal ok:)没问题