C# 查找嵌套集合的最大深度/级别
我想创建一个属性,可以找到嵌套树结构的深度。下面的静态代码通过递归查找深度/级别。但是,是否可以将此函数作为同一类中的属性而不是静态方法C# 查找嵌套集合的最大深度/级别,c#,linq,recursion,tree,C#,Linq,Recursion,Tree,我想创建一个属性,可以找到嵌套树结构的深度。下面的静态代码通过递归查找深度/级别。但是,是否可以将此函数作为同一类中的属性而不是静态方法 public static int GetDepth(MenuGroup contextMenuItems) { if (contextMenuItems == null || contextMenuItems.Items.Count == 0) return 0; var subMenu = contextMenuItems
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项作为子元素
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;
}
}
您可以这样创建属性:public int Depth{get{return GetDepthsomething;}private set;}该菜单组中有一些内容。您可以将方法设置为私有的和非静态的,并在本例中使用它method@defaultlocale:事实上,这并不是完全没有必要。我花了一段时间才弄清楚到底发生了什么,但我想我现在明白了。不过,我同意,of类型当然更清晰——请参阅我编辑过的答案。您可以使用递归来查找列表的深度。以上述方式
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;
}
}
public string GenerateMenu()
{
StringBuilder sb = new StringBuilder();
sb.Append("<nav id=\"nvMenu\" class=\"main-nav\"><ul>");
sb.Append(PrepareMenuUL(AppConfig._AppConfigInstance.Navigation.FirstOrDefault().NavigationClass));
sb.Append("</ul></nav>");
return sb.ToString();
}
private string PrepareMenuUL(List<Navigation> navigation)
{
StringBuilder sb = new StringBuilder();
if (Liflag == 1)
{
sb.Append("</li>");
Liflag = 0;
}
foreach (var item in navigation)
{
var subMenu = item.NavigationClass.Select(b => b as Navigation);
if (subMenu.Any())
{
sb.Append("<li class=\"dropdown\">");
if (subMenu.Any() && item.Url == "#")
sb.Append(string.Format("<a href=\"{0}\">{1}<i class=\"icon-arrow\"></i></a>", BaseUrl + item.Url, item.Name));
else if (subMenu.Any() && item.Url != "#" && item.Url != null)
sb.Append(string.Format("<a href=\"{0}\">{1}<i class=\"icon-rightarrow\"></i></a>", BaseUrl + item.Url, item.Name));
}
else
{
sb.Append("<li>");
sb.Append(string.Format("<a href=\"{0}\">{1}</a>", BaseUrl + item.Url, item.Name));
}
if (subMenu.Any())
sb.Append("<ul class=\"wd190\">");
if (item.NavigationClass.Count > 0)
{
Liflag = 1;
sb.Append(PrepareMenuUL(item.NavigationClass));
}
sb.Append("</li>");
if (subMenu.Any())
sb.Append("</ul>");
}
return sb.ToString();
}