整理生成树形结构的方法,非原创
1、定义测试类,实际使用可以从数据库获取
public class Category
{
public int CategoryId { get; set; }
public string Name { get; set; }
public int? ParentCategoryId { get; set; }
}
2、定义树形节点类
public class TreeItem<T>
{
public T Item { get; set; }
public IEnumerable<TreeItem<T>> Children { get; set; }
}
3、定义扩展方法 返回树形结构
public static class Help
{
public static IEnumerable<TreeItem<T>> GenerateTree<T, K>(
this IEnumerable<T> collection,
Func<T, K> idSelector,
Func<T, K> parentIdSelector,
K rootId = default(K))
{
foreach (var c in collection.Where(u =>
{
var selector = parentIdSelector(u);
return (rootId == null && selector == null)
|| (rootId != null && rootId.Equals(selector));
}))
{
System.Threading.Thread.Sleep(3000);
yield return new TreeItem<T>
{
Item = c,
Children = collection.GenerateTree(idSelector, parentIdSelector, idSelector(c))
};
}
}
}
4、测试验证
private void button1_Click(object sender, EventArgs e)
{
var categories = new List<Category>
{
new Category { CategoryId = 1, Name = "Electronics", ParentCategoryId = null },
new Category { CategoryId = 2, Name = "Mobile Phones", ParentCategoryId = 1 },
new Category { CategoryId = 3, Name = "Laptops", ParentCategoryId = 1 },
new Category { CategoryId = 4, Name = "Smartphones", ParentCategoryId = 2 },
new Category { CategoryId = 5, Name = "Gaming Laptops", ParentCategoryId = 3 },
new Category { CategoryId = 6, Name = "Clothing", ParentCategoryId = null },
new Category { CategoryId = 7, Name = "Men's Clothing", ParentCategoryId = 6 },
new Category { CategoryId = 8, Name = "Women's Clothing", ParentCategoryId = 6 },
};
var tree = categories.GenerateTree(
c => c.CategoryId, // idSelector
c => c.ParentCategoryId // parentIdSelector
);
PrintTree(tree, 0);
}
private void PrintTree<T>(IEnumerable<TreeItem<T>> tree, int indent)
{
foreach (var node in tree)
{
if (node.Item is Category)
{
Category category = node.Item as Category;
string msg = string.Format("{0}{1}", new string(' ', indent * 2), category.Name);
Console.WriteLine(msg);
}
PrintTree(node.Children, indent + 1);
}
}
5、验证结果
Electronics
Mobile Phones
Smartphones
Laptops
Gaming Laptops
Clothing
Men's Clothing
Women's Clothing