【发布时间】:2021-09-20 22:42:02
【问题描述】:
我有一个嵌套列表结构如下:
class Person {
public string Name;
public List<Person> Children;
public int RowSpan {
get
{ int childrenCount = 0;
/* go through children (if any) and update childrenCount */
return childrenCount == 0 ? 1 : childrenCount;
}
};
}
编辑:我的真实数据结构与父母/孩子无关。我只是选择了一个简单的数据结构,使问题易于理解。假设每个爷爷可以有任意数量的儿子。每个儿子可以有任意数量的孩子。没有两个爷爷可以共享同一个儿子。同样,儿子不能分享孩子。
Edit2:我没有为每个单元格获取 RowSpan 的问题。这很容易。问题是:如何在迭代和遍历数据结构的同时解析表格的HTML结构。
我按如下方式填充此结构的示例:
Person grandpa1 = new Person { Name = "GrandPa1" };
Person grandpa2 = new Person { Name = "GrandPa2" };
Person son1 = new Person { Name = "Son 1" };
Person son2 = new Person { Name = "Son 2" };
Person grandkid1 = new Person { Name = "GrandKid1" };
Person grandkid2 = new Person { Name = "GrandKid2" };
Person grandkid3 = new Person { Name = "GrandKid3" };
grandpa1.Children = new List<Person> { son1, son2 };
son2.Children = new List<Person> { grandkid1, grandkid2, grandkid3 };
List<Person> family = new List<Person> { grandpa1, grandpa2 } ;
我正在尝试使用 <td rowspan={number of offsprints}> 在 HTML 表中表示 family 结构
对于上述系列,输出如下所示:
.------------------.
| | |
| | son1 |
| |-------|-----------.
| | | grandkid1 |
| grandpa1 | |-----------.
| | | grandkid2 |
| | son2 |-----------.
| | | grandkid3 |
|----------|-------.-----------.
| grandpa2 |
.----------.
在上表中,grandpa 的rowspan 是4。 son2 的 rowspan 是 3。
等价的 HTML 应该是这样的:
table {
border-collapse: collapse;
}
td, th {
border: 1px solid black;
padding: 4px;
}
th
{
font-family: monospace;
background-color: #def;
padding: 0 2em;
}
<table>
<thead>
<tr>
<th>Grand Parents</th>
<th>Sons</th>
<th>Kids</th>
</tr>
</thead>
<tr>
<td rowspan="4"> grandpa1 </td>
<td> son1 </td>
</tr>
<tr>
<!-- no cell for grandpa1:in progress -->
<!-- no cell for son1: fulfilled -->
<td rowspan="3"> son2 </td>
<td> kid1 </td>
</tr>
<tr>
<!-- no cell for grandpa1: in progress -->
<!-- no cell for son2: in progress -->
<td> kid2 </td>
</tr>
<tr>
<!-- no cell for grandpa1: in progress -->
<!-- no cell for son2: in progress -->
<td> kid3</td>
</tr>
<tr>
<!-- no cell for grandpa1: fullfilled -->
<!-- no cell for son2: fullfilled -->
<td> grandpa2 </td>
</tr>
</table>
我正在努力编写一个生成上述 HTML 结构的算法。 我尝试了多种方法:
1- 我为家庭的每个级别生成了一个Queue<TagBuilder>,并遍历了最高级别和Enqueue TD,其中行跨度为较低级别的受抚养人数量。然后我为其他级别生成了其他队列。最后,我的计划是一次从所有级别 DeQueue 并将 TD 附加到新的 TR 中。但这不起作用,因为son1 没有孩子,从第 3 级出列会获取 son2 的孩子..
2- 我尝试迭代祖父母级别并为每个祖父母附加一个 TR,其中包含一个具有他儿子/孙子行跨度的单个 TD。然后遍历儿子级别并做同样的事情,同样在孙子级别。但是整个表格的格式会不正确。
我可以在 Excel 中轻松生成结构,因为我能够在迭代第一级时引用单元格及其合并状态,并且可以从之前的行返回并追加新单元格。
有没有一种简单的方法可以从上面的数据结构中生成家族结构表?
【问题讨论】:
-
你会如何代表两个父母的孩子?通常需要两个来制作一个。我希望爷爷 1 和爷爷 2 有相同的孩子,尽管情况并非总是如此(你也可以包括继父母)
-
@Andrei15193 我更新了我的问题。各级不共享后代。
-
尝试将
RowSpan属性添加到 person 类,并在遍历每个项目时更新它。这似乎是编写递归函数来遍历每个关系的一个很好的用例。 -
@Ahmad 在这种情况下,如果你把它看成一棵树,你需要的是每个节点的叶子数。即:祖父母有 2 个孩子,1 有 2 个孩子,另外 3 个。祖父母节点的叶子是 5(总共 5 个孙子),而第一个孩子是 2 个,其他 3 个。每个孙子是 1,因为每个其中是树上的一片叶子。您可以编写一个方法来获取当前节点(包括当前节点)的叶子数。
标签: c# html tagbuilder