c# - 创建分层类结构,遍历数据表,然后添加父子并返回对象

标签 c# hierarchy

我想创建一个类结构,可以表示所有相同类型的对象的以下层次结构

-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/

相关文章:

C# 抓取 HTML/.asp

c# - 是否可以在 C# 控制台中设置制表符大小

c# - 如何判断 ListView 正在显示哪些项目?

java - 父构造函数调用的方法表现为子方法

c++ - C++ 常见问题解答中类层次结构的打印模式

c# - UWP 用户控件 + 内容控件

c# - C#中的双引号字符串替换

sql - 在 sql join 中合并部分重复的行

java - Derby 数据库 - 确定层次结构中的级别以转换 DB -> DefaultMutableTreeNode Java 对象

R-如何获取cutree组之间的关系?