在 C# 中从平面列表创建嵌套列表

lem*_*ari 5 .net c#

我目前有以下课程:

public class NavigationItem
{
    public int ID { get; set; }
    public string Title { get; set; }
    public int ParentID { get; set; }
    public List<NavigationItem> Children { get; set; }
}

public class FlatItem
{
    public int ID { get; set; }
    public string Title { get; set; }
    public int ParentID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我有一个示例数据如下:

+====+============+==========+
| ID |   Title    | ParentID |
+====+============+==========+
|  1 | Google     |          |
+----+------------+----------+
|  2 | Microsoft  |          |
+----+------------+----------+
|  3 | Oracle     |          |
+----+------------+----------+
|  4 | Gmail      |        1 |
+----+------------+----------+
|  5 | Sheets     |        1 |
+----+------------+----------+
|  6 | Adsense    |        1 |
+----+------------+----------+
|  7 | Azure      |        2 |
+----+------------+----------+
|  8 | SharePoint |        2 |
+----+------------+----------+
|  9 | Office     |        2 |
+----+------------+----------+
| 10 | Java       |        3 |
+----+------------+----------+
| 11 | Word       |        9 |
+----+------------+----------+
| 12 | Excel      |        9 |
+----+------------+----------+
| 13 | PowerPoint |        9 |
+----+------------+----------+
Run Code Online (Sandbox Code Playgroud)

我已经有了从上面的示例数据中提取所有信息并将其转换为List<FlatItem>对象的代码。

什么是最好的方法,以便我可以拥有一个List<NavigationItem>如下所示的对象:

  • 谷歌
    • Gmail
    • 床单
    • 广告
  • 微软
    • 天蓝色
    • 共享点
    • 办公室
      • 单词
      • 电子表格
      • 微软幻灯片软件
  • 甲骨文
    • 爪哇

我正在考虑创建一个递归方法来循环遍历我的List<FlatItem>then 结构,使其成为 NavigationItem 的嵌套列表。

ViR*_*iTy 3

不需要递归。您可以使用 LINQ 轻松构建结构:

List<FlatItem> flatItems = ...;

var navigationItems = flatItems.Select(
    i => new NavigationItem { ID = i.ID, Title = i.Title, ParentID = i.ParentID }
).ToList();

foreach (var i in navigationItems)
    i.Children = navigationItems.Where(n => n.ParentID == i.ID).ToList();

// get Google, Microsoft, Oracle items
var rootNavigationItems = navigationItems.Where(n => n.ParentID == 0);
Run Code Online (Sandbox Code Playgroud)