平面列表到层次结构

NHu*_*ker 8 linq hierarchical-data

我最难将列表(Of Folder)转换为层次结构.

Public Class Folder

Public Property FolderID() As Integer
Public Property Name() As String
Public Property ParentFolderID() As Integer
Public Property Children() as IEnumerable(Of Folder)

End Class
Run Code Online (Sandbox Code Playgroud)

我需要返回填充了Children的List(Of Folder).

我从数据库中的数据构建一个List(Of Folder).

{1,"文件夹1",没有} {2,"文件夹2",1} {3,"文件夹3",2} {4,"文件夹4",3} {5,"文件夹5",没什么}

我无法弄清楚如何以递归方式将子文件夹移动到其父级的Children属性中.

我想用LINQ做这个.

任何帮助是极大的赞赏.

更新

谢谢你的回答,但不是那里.根据你的答案,我想出了几乎可行的.

Dim list = (From folder in folderList Select New Folder() With {
    .FolderID = folder.FolderID, 
    .Name = folder.Name, 
    .ParentFolderID = folder.ParentFolderID, 
    .Children = (From child in folderList 
                 Where child.ParentFolderID = item.FolderID).ToList()}).ToList()

{1, "Root", Nothing}
{2, "Child", 1}
{3, "Grand Child", 2}
Run Code Online (Sandbox Code Playgroud)

我得到了所有三个文件夹的列表:

Root
--Child
Child
--Grand Child
Grand Child
Run Code Online (Sandbox Code Playgroud)

应该是这样的:

Root
--Child
----Grand Child
Run Code Online (Sandbox Code Playgroud)

Eni*_*ity 12

如果使用ToLookup扩展方法,这很容易.

C#:

var lookup = folderList.ToLookup(f => f.ParentFolderID);

foreach (var folder in folderList)
{
    folder.Children = lookup[folder.FolderID].ToList();
}

var rootFolders = lookup[null].ToList();
Run Code Online (Sandbox Code Playgroud)

VB:

Dim lookup = folderList.ToLookup(Function (f) f.ParentFolderID)

For Each folder In folderList
    folder.Children = lookup(folder.FolderID).ToList()
Next

Dim rootFolders = lookup(Nothing).ToList()
Run Code Online (Sandbox Code Playgroud)


Jah*_*ine 0

C#版本

var newList = list.Select(o=> 
   new Fodler
   { 
        FodlerID = o.FodlerID,
        Children = list.Where(q => q.ParentId == o.FodlerID),
        Parent = list.FirstOrDefault(q => q.FodlerID == o.ParentID ),
        //Other properties goes here
   });
Run Code Online (Sandbox Code Playgroud)

尽管如果您在 EF 等中进行了正确的映射,它应该会自动完成。