我想创建一个类结构,可以表示所有相同类型的对象的以下层次结构
-Parent1
- - Child1
- - - ChildA of Child1
- - - ChildB of Child1
- - Child2
- - - ChildA of Child2
- - - ChildB of Child2
- Parent2
数据表行有一个 ID、ParentID、名称和级别
Parent 级别为 O,Child 1 级别为 1,ChildA 级别为 2,依此类推
我能够将数据从数据库返回到数据表,但在那之后我很挣扎 非常感谢任何有关创建类结构然后填充对象的帮助
最佳答案
这是一个关于如何使用 LINQ 执行此操作的示例。首先是一个样本数据表。我假设顶级项目的父 ID 为 0。
var dataTable = new DataTable();
dataTable.Columns.Add("Id", typeof(Int32));
dataTable.Columns.Add("ParentId", typeof(Int32));
dataTable.Columns.Add("Name", typeof(String));
dataTable.Rows.Add(new Object[] { 1, 0, "A" });
dataTable.Rows.Add(new Object[] { 2, 1, "B" });
dataTable.Rows.Add(new Object[] { 3, 1, "C" });
dataTable.Rows.Add(new Object[] { 4, 0, "D" });
dataTable.Rows.Add(new Object[] { 5, 4, "E" });
代表每项数据的类:
class Item {
public Int32 Id { get; set; }
public String Name { get; set; }
public IEnumerable<Item> Children { get; set; }
}
获取特定项目的子项的函数:
IEnumerable<DataRow> GetChildren(DataTable dataTable, Int32 parentId) {
return dataTable
.Rows
.Cast<DataRow>()
.Where(row => row.Field<Int32>("ParentId") == parentId);
}
创建包含子集合的项目的函数。此函数将向下递归层次结构:
Item CreateItem(DataTable dataTable, DataRow row) {
var id = row.Field<Int32>("Id");
var name = row.Field<String>("Name");
var children = GetChildren(dataTable, id)
.Select(r => CreateItem(dataTable, r))
.ToList();
return new Item { Id = id, Name = name, Children = children };
}
获取顶级项目行的函数:
IEnumerable<DataRow> GetTopLevelRows(DataTable dataTable) {
return dataTable
.Rows
.Cast<DataRow>()
.Where(row => row.Field<Int32>("ParentId") == 0);
}
综合起来:
var items = GetTopLevelRows(dataTable)
.Select(row => CreateItem(dataTable, row))
.ToList();
关于c# - 创建分层类结构,遍历数据表,然后添加父子并返回对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10395897/