C# 如何使用linq(非二叉树)建立树节点关系
我有一个结构如下的类C# 如何使用linq(非二叉树)建立树节点关系,c#,asp.net,.net,linq,C#,Asp.net,.net,Linq,我有一个结构如下的类 public class Menu { public Menu() { ChildMenus = new List<Menu>(); } public string MenuName { get; set; } public int Id { get; set; } public int Level { get; set; } public int Order { get; set; }
public class Menu
{
public Menu()
{
ChildMenus = new List<Menu>();
}
public string MenuName { get; set; }
public int Id { get; set; }
public int Level { get; set; }
public int Order { get; set; }
public string RefCode { get; set; }
public List<Menu> ChildMenus { get; set; }
public int ParentId { get; set; }
}
首先,与前面的注释相反,递归不需要处理树。它通常是最简单、最简单的方法(顺便说一句,也是我提供的方法)——但不是必需的(有时也有避免递归的性能原因) 注意,扩展方法基于我从这里偷来的一个片段: 然后在一些静态类中:
public static IEnumerable<T> AsBreadthFirstEnumerable<T>(this T head, Func<T, IEnumerable<T>> childrenFunc)
{
yield return head;
var last = head;
foreach (var node in AsBreadthFirstEnumerable(head, childrenFunc))
{
foreach (var child in childrenFunc(node))
{
yield return child;
last = child;
}
if (last.Equals(node)) yield break;
}
}
public static IEnumerable AsBreadthFirstEnumerable(此T头,Func childrenFunc)
{
回程压头;
var last=水头;
foreach(AsBreadthFirstEnumerable(head,childrenFunc)中的var节点)
{
foreach(childrenFunc(节点)中的变量child)
{
退换子女;
最后一个=孩子;
}
如果(最后一个等于(节点))屈服断裂;
}
}
它不是纯粹的LINQ-但它应该给你一些开始的东西。LINQ中没有递归,尽管你可以编写自己的扩展方法来递归,因为没有设置ChildMenu属性,你想根据引用代码填充它们?为什么你有“ID”。这不是一个数据库。改用引用。
Product Sales Contact
Mobile Local Sales Email
Nokia Kerala
LG
Computer
Accer
var filteredMenus = from m in Menucollection
where m.RefCode != "0" || Menucollection.Any(m1=>m1.ParentId == m.Id)
select m;
foreach(var m in filteredMenus)
{
m.ChildMenus = filteredMenus.Where(m1=>m1.ParentId == m.Id).ToList();
}
var expanded = from m in filteredMenus
where m.ParentId == 0
select new { Menu = m, Descendants = m.AsBreadthFirstEnumerable(m1 => m1.ChildMenus) };
foreach (var m in expanded)
{
System.Diagnostics.Debug.WriteLine("Menu: " + m.Menu.MenuName);
foreach (var m1 in m.Descendants)
{
System.Diagnostics.Debug.WriteLine("- " + m1.MenuName);
}
}
public static IEnumerable<T> AsBreadthFirstEnumerable<T>(this T head, Func<T, IEnumerable<T>> childrenFunc)
{
yield return head;
var last = head;
foreach (var node in AsBreadthFirstEnumerable(head, childrenFunc))
{
foreach (var child in childrenFunc(node))
{
yield return child;
last = child;
}
if (last.Equals(node)) yield break;
}
}