2011-08-12 23 views
5

मेरे पास एक अवलोकन संग्रह है जिसमें से मैं एक विशिष्ट उदाहरण आइटम को हटाना चाहता हूं।एक अवलोकन संग्रह से हटाना

उदा।

data[1].ChildElements[0].ChildElements[1].ChildElements.RemoveAt(1);

यह काम करता है ठीक है, तथापि, के रूप में इस एक treeview से बच्चे तत्वों को हटाने से संबंधित है, मैं गतिशील ऊपर बयान क्या treeview के स्तर पर क्लिक किया जाता है पर निर्भर बनाना चाहते हैं। तो मैं चाहता हूँ सकता है:

data[0].ChildElements[1].ChildElements.RemoveAt(0);

या

data[1].ChildElements.RemoveAt(0);

मैं जानता हूँ कि आईडी माता पिता वस्तुओं के के जो मैं किसी सूची में दूर संग्रहीत किया है, उदाहरण के लिए

0 1 0 या 1,0

मेरे सवाल यह है कि मैंने उपरोक्त कथन जब मुझे पता है कि उनकी संख्या कितनी आइटम वहाँ सूची संग्रह में होने जा रहे हैं न बनाने के बारे में जाना है?

धन्यवाद।

+1

प्रश्न का शीर्षक थोड़ा भ्रामक है। आप विशेष रूप से एक पर्यवेक्षण चयन का उपयोग कर रहे हैं लेकिन प्रश्न का अवलोकन करने योग्य चयन के साथ कुछ लेना देना नहीं है। समस्या किसी भी पुनरावर्ती डेटा संरचना के लिए समान होगी चाहे वह एक अवलोकन योग्य चयन या सरणी या सूची के साथ लागू हो। – Davy8

उत्तर

0

मैं रिकर्सिव फ़ंक्शंस का उपयोग करूंगा, जो आपको वास्तविक/वर्तमान नोड दे सकता है, और आप बाध्य अवलोकन योग्य को ढूंढ सकते हैं और इससे हटा सकते हैं।

+0

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

+0

आपकी संग्रह संरचना को वही है (यानी माता-पिता के पास हमेशा "नोड्स" संग्रह होता है, क्या आप वही रिकर्सिव फ़ंक्शन का उपयोग नहीं कर सकते हैं जो आपको अवलोकन करने योग्य चयन देता है? –

0

कुछ इस तरह:

private void RemoveSpecificInstance(IList<int> ids, ObservableCollection<SomeClass> currentCollection) 
    { 
     if (ids.Count == 0) 
     { 
      // The initial collection didn't have children 
      return; 
     } 
     else if (ids.Count == 1) 
     { 
      currentCollection.RemoveAt(ids.Single()); 
     } 
     else 
     { 
      int index = ids.First(); 

      RemoveSpecificInstance(ids.Skip(1).ToList(), currentCollection[index].ChildElements); 
     } 
    } 
1

कभी कभी पुराने स्कूल यह सबसे अच्छा है।

static void RemoveByPath(YourClass currentNode, int[] path) 
    { 
     for (int i = 0; i < path.Length - 1; i++) 
     { 
      currentNode = currentNode.ChildElements[path[i]]; 
     } 
     currentNode.ChildElements.RemoveAt(path[path.Length-1])); 
    } 
मामले में

आप एक "रूट" YourClass उदाहरण (मुझे लगता है तुम क्या लेकिन सिर्फ मामले में) की जरूरत नहीं है जोड़ें: -

static void RemoveByPath(IList<YourClass> data, int[] path) 
{ 
    if (path.Length > 1) 
    { 
     RemoveByPath(data[path[0]], path.Skip(1).ToArray()); 
    } 
    else 
    { 
     data.RemoveAt(path[0]); 
    } 
} 

तो अगर आप कुछ चालाक चाहते हैं आप बदल सकते हैं इन विस्तार विधियों में।

+0

मुझे व्यक्तिगत रूप से रिकर्सिव के बजाय पुनरावृत्ति संस्करण पसंद है। –

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