2011-01-14 21 views
8

Bir listeyi (Klasörün) hiyerarşiye dönüştürmek için en zor zamanı yaşıyorum.hiyerarşiye ait düz liste

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 

Çocuklar (Klasörün) nüfuslu Çocuklar ile birlikte döndürülmesi gerekiyor.

Veritabanındaki verilerden bir Klasör Listesi yapıyorum.

{1, "Dosya 1", hiçbir} {2, "Dosya" 2, 1} {3, "Dosya" 3, 2} {4, "Dosya" 4, 3} {5 , "Klasör 5", Hiçbir şey}

Çocuk klasörlerini, üst klasörünün Children özelliğine nasıl yinelemeli olarak taşıyacağımı anlayamıyorum.

Bunu LINQ ile yapmak istiyorum.

Her türlü yardım büyük beğeni topluyor.

Güncelleme ama oldukça orada, Cevabınız için teşekkür ederiz. Cevabınıza dayanarak, neredeyse işe yarayan ile ortaya çıktım.

Root 
--Child 
Child 
--Grand Child 
Grand Child 

gibi görünmelidir:

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} 

Ben her üç klasörlerin bir listesini almak

Root 
--Child 
----Grand Child 

cevap

0

C# sürümü

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

rağmen doğru eşleme yaparsanız örneğin EF, otomatik olarak yapılmalıdır.

12

ToLookup uzantı yöntemini kullanırsanız bu kolaydır.

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: Sonra

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

bu gibi kullanabilirsiniz:

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

ToLookup uzantısının güzel bir kullanımı. –

0

bu uzatma yöntemi deneyin

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

Merhaba. Bu snippet benim için çok sıkı görünüyor, ama nasıl çağırılır? x => x.Parent'i anlamıyorum. Bana doğru yönde işaret eden bir örnek verebilir mi? – m33

+0

Kullanmak için bir statik sınıfta yukarıdaki uzantı yöntemini oluşturmanız gerekir. İlk parametre, ana düğümü nasıl bulacağınızı ve ikinci parametrenin alt koleksiyonun nasıl alınacağını belirler. –

İlgili konular