Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 递归函数-如何在具有多个级别的类中仅提取具有特定值的子级_C#_Recursion_Static Methods - Fatal编程技术网

C# 递归函数-如何在具有多个级别的类中仅提取具有特定值的子级

C# 递归函数-如何在具有多个级别的类中仅提取具有特定值的子级,c#,recursion,static-methods,C#,Recursion,Static Methods,我有一个属性为RegionType的Region类。区域类型可以是“国家”、“多城市”、“城市”、“社区”等。在任何给定的地区,我都希望提取所有的社区,所以在泰国,我希望得到曼谷、苏梅岛等。因为它们是城市,我需要再往下一层——我如何递归地做到这一点?我尝试创建如下所示的递归静态方法: public static List<Region> GetNeighborhoods(this Region region, ref List<Region> neighborhoods)

我有一个属性为RegionType的Region类。区域类型可以是“国家”、“多城市”、“城市”、“社区”等。在任何给定的地区,我都希望提取所有的社区,所以在泰国,我希望得到曼谷、苏梅岛等。因为它们是城市,我需要再往下一层——我如何递归地做到这一点?我尝试创建如下所示的递归静态方法:

public static List<Region> GetNeighborhoods(this Region region, ref List<Region> neighborhoods)
{

    var ctx = new DalContext();

    if (region.RegionType == "Country" || 
        region.RegionType == "Multi-Region (within a country)" || 
        region.RegionType == "City" ||
        region.RegionType == "Multi-City (Vicinity)" || 
        region.RegionType == "Province (State)" || 
        region.RegionType == "Multi-Region (within a country)")
    {
        IEnumerable<Region> childrens = region.GetChildren();

        if (childrens.Any())
        {
            foreach (var child in childrens)
            {
                return GetNeighborhoods(child, ref neighborhoods);
            }
        }
    }
    else
    {
        neighborhoods.AddRange(ctx.Regions
                               .Where(r => r.ParentRegionId == region.ParentRegionId 
                                      && r.RegionType == "Neighborhood" 
                                      && r.RegionNameLong.Contains(region.RegionName) 
                                      && r.Id != region.Id).ToList());
    }

    return neighborhoods;
}
public static List GetNeighborhoods(此区域,ref List neighborhoods)
{
var ctx=new DalContext();
如果(region.RegionType==“Country”|
region.RegionType==“多地区(一个国家内)”||
region.RegionType==“城市”||
region.RegionType==“多城市(邻近地区)”||
region.RegionType==“省(州)”||
region.RegionType==“多地区(一个国家内)”)
{
IEnumerable childrens=region.getChildrens();
if(childrens.Any())
{
foreach(儿童中的儿童变量)
{
返回GetNeighborhoods(子邻居、参考邻居);
}
}
}
其他的
{
邻居。添加范围(ctx.Regions
。其中(r=>r.ParentRegionId==region.ParentRegionId
&&r.RegionType==“邻居”
&&r.RegionNameLong.Contains(region.RegionName)
&&r.Id!=region.Id).ToList();
}
返回社区;
}
ctx是我所有区域的DB实例。 在运行结束时,我在邻居列表中得到0个区域。
帮助???

您最好将其转换为返回
IEnumerable
的方法

如果没有所有类的定义,我无法检查这一点的有效性,但以下几点应该可以:

public static IEnumerable<Region> GetNeighborhoods(Region region)
{
    if 
    (
        region.RegionType == "Country" || 
        region.RegionType == "Multi-Region (within a country)" || 
        region.RegionType == "City" ||
        region.RegionType == "Multi-City (Vicinity)" || 
        region.RegionType == "Province (State)" || 
        region.RegionType == "Multi-Region (within a country)"
    )
    {
        foreach (var child in region.GetChildren())
            foreach (var region in GetNeighborhoods(child))
                yield return region;
    }
    else
    {
        var ctx = new DalContext();

        var matchingRegions = ctx.Regions.Where(r => 
            r.ParentRegionId == region.ParentRegionId && 
            r.RegionType == "Neighborhood" &&
            r.RegionNameLong.Contains(region.RegionName) && 
            r.Id != region.Id
        );

        foreach (var region in matchingRegions)
            yield return region;
    }
}
公共静态IEnumerable GetNeighborhood(区域)
{
如果
(
region.RegionType==“国家”|
region.RegionType==“多地区(一个国家内)”||
region.RegionType==“城市”||
region.RegionType==“多城市(邻近地区)”||
region.RegionType==“省(州)”||
region.RegionType==“多地区(一个国家内)”
)
{
foreach(region.GetChildren()中的var child)
foreach(GetNeighborhoods中的var区域(子))
收益回报区;
}
其他的
{
var ctx=new DalContext();
var matchingRegions=ctx.Regions.Where(r=>
r、 ParentRegionId==region.ParentRegionId&&
r、 RegionType==“邻居”&&
r、 RegionNameLong.Contains(region.RegionName)和
r、 Id!=region.Id
);
foreach(匹配区域中的var区域)
收益回报区;
}
}

但是,我不知道
DalContext()
在做什么,所以它可能会在该区域完全失败…

在if条件下有两次多区域。我还认为用结束条件启动递归函数是一种习惯。@o_weisman我刚刚复制了OP的代码-不知道它的确切功能,我无法进行彻底的更改。然而,“结束条件”显然是“不再有孩子”,这当然隐含在第一个
foreach
中。