我有一个具有以下结构的课程
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 class MenuManager
{
public List<Menu> Menucollection;
public MenuManager()
{
Menucollection = new List<Menu>
{
new Menu {MenuName = "Products", Id = 1, ParentId = 0, Level = 1, RefCode = "0", Order = 1},
new Menu {MenuName = "Sales", Id = 2, ParentId = 0, Level = 1, RefCode = "0", Order = 2},
new Menu {MenuName = "Contacts", Id = 3, ParentId = 0, Level = 1, RefCode = "0", Order = 3},
new Menu {MenuName = "Mobiles", Id = 4, ParentId = 1, Level = 2, RefCode = "0", Order = 1},
new Menu {MenuName = "Computers", Id = 5, ParentId = 1, Level = 2, RefCode = "0", Order = 2},
new Menu {MenuName = "Local Sales", Id = 6, ParentId = 2, Level = 2, RefCode = "0", Order = 1},
new Menu {MenuName = "Forgin Sales", Id = 7, ParentId = 2, Level = 2, RefCode = "0", Order = 2},
new Menu {MenuName = "Email", Id = 8, ParentId = 3, Level = 2, RefCode = "100", Order = 1},
new Menu {MenuName = "Nokia", Id = 9, ParentId = 4, Level = 3, RefCode = "110", Order = 1},
new Menu {MenuName = "LG", Id = 10, ParentId = 4, Level = 3, RefCode = "111", Order = 2},
new Menu {MenuName = "Accer", Id = 11, ParentId = 5, Level = 3, RefCode = "210", Order = 1},
new Menu {MenuName = "Kerala", Id = 9, ParentId = 6, Level = 3, RefCode = "110", Order = 1}
};
}
public void BuildMenu()
{
}
}
我需要从集合中构建一个菜单结构,条件如下:
如果出现以下情况,必须删除菜单项:
因此,基于输入的预期结果应为:
Product Sales Contact
Mobile Local Sales Email
Nokia Kerala
LG
Computer
Accer
答案 0 :(得分:1)
首先,与之前的评论相反,不需要递归来处理树。它通常是最简单,最简单的方法(顺便提一下,我提供的方法) - 但不是必需的(并且有时可以避免递归的性能原因)。
注意,扩展方法是基于我从这里发送的剪切我:Searching a tree using LINQ
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;
}
}
它不是纯粹的LINQ - 但它应该给你一些起点。