c# - 查找嵌套集合的最大深度/级别

标签 c# linq recursion tree

我想创建一个可以找到嵌套树结构深度的属性。下面的静态通过递归找出深度/级别。但是是否可以将此函数作为同一个类中的属性而不是静态方法?

public static int GetDepth(MenuGroup contextMenuItems)
{
    if (contextMenuItems == null || contextMenuItems.Items.Count == 0)
        return 0;

    var subMenu = contextMenuItems.Items.Select(b => b as MenuGroup);
    if (!subMenu.Any())
        return 1;

    var subLevel = subMenu.Cast<MenuGroup>().Select(GetDepth);
    return !subLevel.Any() ? 1 : subLevel.Max() + 1;
}

关于代码的更多信息: MenuGroupMenuItem 派生自MenuBase

MenuGroup 具有 ObservableCollection<MenuBase> Items 的子节点作为子元素

MenuItem 是一个没有任何子节点的离开节点。

最佳答案

好吧,你可以很容易地将它变成一个实例属性,是的:

public int Depth
{
    get
    {
        if (Items.Count == 0)
            return 0;
        var subMenu = Items.Select(b => b as MenuGroup);
        if (!subMenu.Any())
            return 1;
        var subLevel = subMenu.Cast<MenuGroup>().Select(x = > x.Depth);
        return !subLevel.Any() ? 1 : subLevel.Max() + 1;
    }
}

由于要处理非 MenuGroup 项目,这还不能完全工作,但可以使用 OfType 轻松修复而不是 Select 然后 Cast:

public int Depth
{
    get
    {
        // Completely empty menu (not even any straight items). 0 depth.
        if (Items.Count == 0)
        {
            return 0;
        }
        // We've either got items (which would give us a depth of 1) or
        // items and groups, so find the maximum depth of any subgroups,
        // and add 1.
        return Items.OfType<MenuGroup>()
                    .Select(x => x.Depth)
                    .DefaultIfEmpty() // 0 if we have no subgroups
                    .Max() + 1;
    }
}

关于c# - 查找嵌套集合的最大深度/级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327761/

相关文章:

c# - 如何使用 LINQ 返回字符串

javascript - 达到值后解决递归 Promise

c# - Http无法向服务器发送消息

c# - 从矩阵的每一行和每一列中选择一个元素,求和最小化

c# - 传递参数 ASP.Net

c# - 使用 C# 和 VS2008 linq to xml

c# - 如何在不依赖注入(inject)的情况下模拟我们正在 C# 中测试的同一类的另一个方法

c# - 在 Entity Framework 中不同

scala - 使用 Fold 将 List[JsObject] 转换为 JsArray

python - 在递归函数中用尾递归替换 for 循环