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