我想创建一个可以找到嵌套树结构深度的属性。下面的静态通过递归找出深度/级别。但是是否可以将此函数作为同一个类中的属性而不是静态方法?
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;
}
}
关于c# - 查找嵌套集合的最大深度/级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18327761/