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

本文关键字:提取 递归函数 | 更新日期: 2023-09-27 18:30:10

我有一个属性为RegionType的Region类。RegionType可以是"country"、"multi-city"、"city"、"neighbor"等。在任何给定的地区,我都想提取所有的社区,所以在泰国,我希望得到曼谷、苏梅岛等。因为它们是城市,我需要进入另一个层次——我如何递归地做到这一点?我尝试创建如下的递归静态方法:

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;
}

ctx是我所有区域的数据库实例。在跑步结束时,我在邻居列表中得到了0个区域。帮助

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

您最好将其转换为返回IEnumerable<Region>的方法。

如果没有你所有类的定义,我就无法检查它的有效性,但沿着以下几条线应该可以工作:

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;
    }
}

然而,我不知道DalContext()在做什么,所以它可能在这方面完全失败。。。