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