2011-01-14 19 views
8

मुझे एक सूची (फ़ोल्डर का) एक पदानुक्रम में परिवर्तित करने में सबसे कठिन समय है।पदानुक्रम के लिए फ्लैट सूची

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 

मुझे बच्चों के साथ सूची (फ़ोल्डर का) वापस करने की आवश्यकता है।

मैं डेटाबेस में डेटा से एक सूची (फ़ोल्डर का) बनाता हूं।

{1, "फ़ोल्डर 1", कुछ भी नहीं है} {2, "फ़ोल्डर 2", 1} {3, "फ़ोल्डर 3", 2} {4, "फ़ोल्डर 4", 3} {5 , "फ़ोल्डर 5", कुछ भी नहीं}

मैं यह नहीं समझ सकता कि बच्चे के फ़ोल्डर्स को अपने माता-पिता की बच्चों की संपत्ति में दोबारा कैसे स्थानांतरित किया जाए।

मैं LINQ के साथ ऐसा करना चाहता हूं।

किसी भी मदद की बहुत सराहना की जाती है।

अद्यतन

अपने जवाब के लिए धन्यवाद, लेकिन काफी नहीं। आपके उत्तर के आधार पर, मैं इसके साथ आया जो लगभग काम करता है।

Root 
--Child 
Child 
--Grand Child 
Grand Child 

तरह दिखना चाहिए::

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} 

मैं सभी तीन फ़ोल्डरों की एक सूची प्राप्त

Root 
--Child 
----Grand Child 

उत्तर

0

सी # संस्करण

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

यद्यपि आप सही मानचित्रण करते हैं उदाहरण में ईएफ, यह स्वचालित रूप से किया जाना चाहिए।

12

यदि आप ToLookup एक्सटेंशन विधि का उपयोग करते हैं तो यह आसान है।

सी #:

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

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

var rootFolders = lookup[null].ToList(); 

वीबी:, तब

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

आप इस तरह इसका इस्तेमाल कर सकते हैं::

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 एक्सटेंशन का एक अच्छा उपयोग। –

0

इस विस्तार विधि का प्रयास करें

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

नमस्ते। यह स्निपेट मेरे लिए बहुत अंतरंग दिखता है, लेकिन इसे कैसे पेश किया जाए? मैं x => x. parent को नहीं समझता? क्या कोई मुझे सही दिशा में इंगित करने के लिए एक उदाहरण दे सकता है? – m33

+0

आपको इसका उपयोग करने के लिए एक स्थिर वर्ग में उपर्युक्त एक्सटेंशन विधि बनाने की आवश्यकता है। पहला पैरामीटर निर्दिष्ट करता है कि पैरेंट नोड कैसे ढूंढें, और दूसरा पैरामीटर बच्चों के संग्रह को कैसे प्राप्त करें। –

संबंधित मुद्दे