Я столкнулся с несколько сложной проблемой, которую мне трудно обернуть вокруг.
У меня есть класс:
public class Location
{
public string Name { get; set; }
public List<Location> ChildLocations { get; set; }
}
Он снова имеет ссылку на дочерние объекты Location. Так что это рекурсивный список, и я хочу вывести этот список в красиво отформатированную таблицу HTML. Это код:
using System.Collections.Generic;
using System.Web.Mvc;
namespace WebApplication1.Controllers
{
public class Location
{
public string Name { get; set; }
public List<Location> ChildLocations { get; set; }
}
public class HomeController : Controller
{
public ActionResult Index()
{
List<Location> locations = new List<Location>() {
new Location() {
Name = "Item 1",
ChildLocations = new List<Location>() {
new Location()
{
Name="Female",
ChildLocations = new List<Location>()
{
new Location() { Name = "Female 1" },
new Location() { Name = "Female 2" }
}
},
new Location()
{
Name="Male",
ChildLocations = new List<Location>()
{
new Location() { Name = "Male 1" },
new Location() { Name = "Male 2" }
}
}
}
},
new Location() {
Name = "Item 2",
ChildLocations = new List<Location>() {
new Location()
{
Name="Female",
ChildLocations = new List<Location>()
{
new Location() { Name = "M1" },
new Location() { Name = "M2" },
new Location() { Name = "M3" }
}
},
new Location()
{
Name="Male",
ChildLocations = new List<Location>()
},
new Location()
{
Name="Unknown",
ChildLocations = new List<Location>()
}
}
}
};
return View(locations);
}
}
}
и я хочу, чтобы вывод выглядел примерно так:

<table class="table table-border">
<tr>
<td rowspan="4">
Item 1
</td>
<td rowspan="2">
Female
</td>
<td>
Female 1
</td>
</tr>
<tr>
<td>Female 2</td>
</tr>
<tr>
<td rowspan="2">Male</td>
<td>Male 1</td>
</tr>
<tr>
<td>Male 2</td>
</tr>
<tr>
<td rowspan="5">
Item 2
</td>
<td rowspan="3">Female</td>
<td>M1</td>
</tr>
<tr>
<td>M2</td>
</tr>
<tr>
<td>
M3
</td>
</tr>
<tr>
<td>Male</td>
</tr>
<tr>
<td>Unknown</td>
</tr>
</table>
и если кто-то хочет просмотреть HTML, у меня есть jsfiddle для него:
https://jsfiddle.net/4pk0necp/
Я хочу визуализировать таблицу такого типа, используя данные, которые у меня есть в моей программе cshtml:
@using WebApplication1.Controllers;
@model List<Location>
@{
ViewBag.Title = "Home Page";
}
Я понимаю, что потребуется функция для вычисления диапазона строк, поэтому я создал эту крошечную функцию, которая правильно возвращает глубину:
public static int GetDepth(this Location location)
{
int noOfchildren = 0;
bool counted = false;
foreach (Location item in location.ChildLocations)
{
if (item.ChildLocations.Count <= 0)
{
if (!counted)
{
noOfchildren += location.ChildLocations.Where(i => i.ChildLocations.Count <= 0).Count();
counted = true;
}
}
else
noOfchildren += GetDepth(item);
}
return noOfchildren;
}
Список деревьев, о которых идет речь, является лишь примером, и в дереве может быть много уровней глубины. Любая помощь приветствуется.
Редактировать: Я настроил свою функцию GetDepth, так как нам нужно только количество конечных узлов.