2013-02-08 18 views
6

मेरे वर्तमान परियोजना में, एक विधि मैं नियंत्रण नहीं मुझे इस प्रकार का ऑब्जेक्ट भेजता है:एक रिकर्सिव ऑब्जेक्ट को फ़िल्टर कैसे करें?

public class SampleClass 
{ 
    public SampleClass(); 

    public int ID { get; set; } 
    public List<SampleClass> Items { get; set; } 
    public string Name { get; set; } 
    public SampleType Type { get; set; } 
} 

public enum SampleType 
{ 
    type1, 
    type2, 
    type3 
} 

मैं एक TreeView में उन लोगों के डेटा को प्रदर्शित है, लेकिन मैं केवल पथ SampleClass वस्तुओं के साथ समाप्त प्रदर्शित करना चाहते हैं उनके Type संपत्ति type3 करने के लिए सेट करने के बाद, कोई इस पत्ती की गहराई मायने रखते हैं।

मैं ऐसा करने के बारे में पूरी तरह से कोई सुराग नहीं है, कोई मेरी मदद कर सकते?

अग्रिम धन्यवाद!

संपादित

समस्या मैं ali कृपया Jefri और dasblinkenlight द्वारा प्रस्तावित समाधान के साथ मिलने के लिए समझाने के लिए, यहाँ एक तस्वीर है। बाएं कॉलम फ़िल्टरिंग के बिना मूल डेटा है, और सही डेटा फ़िल्टर किया गया है। दोनों विधियां एक ही परिणाम प्रदान करती हैं। लाल में समस्या है।

enter image description here

+1

अगर वहाँ एक type3 राहत के रास्ते पर एक type2 नोड है क्या होना चाहिए? – dasblinkenlight

+0

मैं पूर्ण पथ होना आवश्यक है, तो यह की तरह 'type1> type2 कुछ देना होगा> ...> type3' – Shimrod

उत्तर

0

इस दृष्टिकोण का प्रयास करें:

static bool ShouldKeep(SampleClass item) { 
    return (item.Type == SampleType.type3 && item.Items.Count == 0) 
     || item.Items.Any(ShouldKeep); 
} 

static SampleClass Filter(SampleClass item) { 
    if (!ShouldKeep(item)) return null; 
    return new SampleClass { 
     Id = item.Id 
    , Name = item.Name 
    , Type = item.Type 
    , Items = item.Items.Where(ShouldKeep).Select(x=>Filter(x)).ToList() 
    }; 
} 

ऊपर कोड मानता है कि पत्तियों का Items खाली सूचियों के बजाय null रों हैं।

+0

मैं, ऊपर जवाब के रूप में एक ही समस्या मिल http://stackoverflow.com/questions/14779487/how- करने के लिए फिल्टर एक पुनरावर्ती-वस्तु # comment20692674_14779539 – Shimrod

+0

@Shimrod मुझे नहीं पता था कि "पथ अंत" द्वारा आप का मतलब है कि 'type3' श्रृंखला के अंत में होना चाहिए। संपादन पर एक नज़र डालें। – dasblinkenlight

+0

समस्या अभी भी वहां है, मुझे लगता है कि आइटम संग्रह को पुनर्निर्मित करने के तरीके से आता है। मैंने अपने प्रश्न में एक संपादन किया है, इसे समझाएं – Shimrod

1

इसके अलावा शुरू में जो आइटम, दिखाने के लिए अगर datasize पर्याप्त है और आप उन अक्सर पतन और फिर वर्गों का विस्तार धीमा ui जवाब में मेरी परिणाम क्लिक करें हर के बाद छानने के लिए उम्मीद का निर्धारण करने के लिए।

डेकोरेटर पैटर्न या प्रासंगिक जानकारी के साथ प्रत्येक नोड टैगिंग ताकि छानने हर क्लिक के बाद की आवश्यकता नहीं है के किसी अन्य तरीके पर विचार करें।

+0

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

+0

डेटा नहीं बदलेगा, लेकिन जब भी कोई उपयोगकर्ता नोड का विस्तार करता है तो आपको फ़िल्टर करने के लिए इसे पार करना होगा। यदि डेटा आकार बहुत बड़ा नहीं है जैसा कि आप कहते हैं तो यह कोई समस्या नहीं हो सकती है –

2

इस फ़िल्टर विधि का उपयोग करें:

public void Filter(List<SampleClass> items) 
{ 
    if (items != null) 
    { 
     List<SampleClass> itemsToRemove = new List<SampleClass>(); 

     foreach (SampleClass item in items) 
     { 
      Filter(item.Items); 
      if (item.Items == null || item.Items.Count == 0) 
       if (item.Type != SampleType.type3) 
        itemsToRemove.Add(item); 
     } 

     foreach (SampleClass item in itemsToRemove) 
     { 
      items.Remove(item); 
     } 
    } 
} 
+0

मैंने आपकी विधि की कोशिश की, और मुझे दूसरों के साथ एक ही समस्या है। – Shimrod

+0

@Shimrod यह क्या समस्या होगी? मैंने कई बच्चों के साथ परीक्षण किया है और यह केवल उन पथों को लौटाता है जो 'टाइप 3' के साथ एक पत्ते में समाप्त होते हैं जैसा आप चाहते हैं। क्या आप एक नमूना पोस्ट कर सकते हैं जहां मेरा कोड काम नहीं करता है? –

+0

हाय डेविड। समस्या यह है कि मैंने अपने प्रश्न में संपादन में वर्णित किया है। न केवल टाइप 3 के साथ पत्ता लौटाया गया है, बल्कि इसके माता-पिता के भाई बहन भी हैं। – Shimrod

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