2011-01-14 20 views
8

Me está costando mucho convertir una lista (de carpeta) en una jerarquía.lista plana a la jerarquía

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 

que necesita a la lista (de la carpeta) volver con niños pobladas.

Construyo una lista (de carpetas) a partir de los datos en la base de datos.

{1, "Carpeta 1", Nada} {2, "Carpeta 2", 1} {3, "Carpeta 3", 2} {4, "Carpeta 4", 3} {5 , "Carpeta 5", Nada}

No puedo averiguar cómo mover de forma recursiva las carpetas secundarias a la propiedad de los elementos secundarios de su elemento primario.

Me gustaría hacer esto con LINQ.

Cualquier ayuda es muy apreciada.

actualización

Gracias por su respuesta, pero no está allí. En función de su respuesta, se me ocurrió esto que casi funciona.

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} 

puedo obtener una lista de las tres carpetas:

Root 
--Child 
Child 
--Grand Child 
Grand Child 

debe verse como:

Root 
--Child 
----Grand Child 

Respuesta

0

C# versión

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 
    }); 

Aunque si lo hace la asignación correcta en por ejemplo EF, debe hacerse automáticamente.

12

Es fácil si usa el método de extensión 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(); 

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() 
+0

Un buen uso de la extensión ToLookup. –

0

probar este método de extensión:

public static IEnumerable<T> AsHierarchy<T>(this IEnumerable<T> collection, 
     Func<T, T> parentSelector, Expression<Func<T, IEnumerable<T>>> childrenSelector, T root = default(T)) 
    { 
     var items = collection.Where(x => parentSelector(x).Equals(root)); 
     foreach (var item in items) 
     { 
      var childrenProperty = (childrenSelector.Body as MemberExpression).Member as PropertyInfo; 
      childrenProperty.SetValue(item, collection.AsHierarchy(parentSelector, childrenSelector, item), null); 
     } 
     return items; 
    } 

A continuación, se puede utilizar de esta manera:

list.AsHierarchy(x => x.Parent, x => x.Children); 
+1

Hola. Este fragmento me parece muy interesante, ¿pero cómo invocarlo? No entiendo el x => x.Parent? ¿Alguien puede dar un ejemplo para señalarme en la dirección correcta? – m33

+0

Debe crear el método de extensión anterior en una clase estática para usarlo. El primer parámetro especifica cómo encontrar el nodo primario y el segundo parámetro cómo obtener la colección secundaria. –

Cuestiones relacionadas