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

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


有关代码的更多信息:
MenuGroup和MenuItem从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;
    }
}

10-02 02:55