2011-11-19 16 views
7

से हटाकर previous question से मैंने पूछा, RemoveAll एक शर्त के आधार पर List<> से निकालने का सबसे साफ तरीका है। यह जानने के लिए उत्सुक है कि LinkedList से निकालने का सबसे अच्छा तरीका क्या है क्योंकि RemoveAll कोई फ़ंक्शन नहीं है।एक लिंक्डलिस्ट

List<ItemClass> itemsToErase = new List<ItemClass>(); 
    foreach(ItemClass itm in DS) 
    { 
      if(itm.ToBeRemoved) 
       itemsToErase .Add(itm); 
    } 
    foreach(ItemClass eraseItem in itemsToErase) 
    { 
      DS.Remove(eraseItem); 
    }      

संपादित करें: डी एस प्रकार LinkedList<ItemClass>

उत्तर

23

की है आप एक LinkedList<T> से नोड्स को दूर नहीं जा सकता है, जबकि यह foreach साथ पुनरावृत्ति, आप मैन्युअल रूप से प्रत्येक LinkedListNode<T> की Next संपत्ति का पालन करते हुए LinkedList<T> पुनरावृति कर सकते हैं। बस इसे हटाने से पहले नोड के अगले नोड याद रखें:

var list = new LinkedList<int>(Enumerable.Range(0, 10)); 
var node = list.First; 
while (node != null) 
{ 
    var next = node.Next; 
    if (node.Value % 2 == 0) 
     list.Remove(node); 
    node = next; 
} 

एक्सटेंशन विधि:

public static int RemoveAll<T>(this LinkedList<T> list, Predicate<T> match) 
{ 
    if (list == null) 
    { 
     throw new ArgumentNullException("list"); 
    } 
    if (match == null) 
    { 
     throw new ArgumentNullException("match"); 
    } 
    var count = 0; 
    var node = list.First; 
    while (node != null) 
    { 
     var next = node.Next; 
     if (match(node.Value)) 
     { 
      list.Remove(node); 
      count++; 
     } 
     node = next; 
    } 
    return count; 
} 

उपयोग:

LinkedList<ItemClass> DS = ... 
DS.RemoveAll(itm => itm.ToBeRemoved); 

भी देखें: Extension Methods (C# Programming Guide)

+0

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

+0

@svick: अच्छा विचार; विस्तार विधि जोड़ा गया। – dtb

+0

मैं विस्तार विधि में नया हूं। क्या आप कृपया मेरे मामले के लिए इस विशेष विस्तार विधि का उपयोग कैसे करें। – devnull

0

System.Collections.Generic.LinkedList<T> से किसी आइटम को निकालने का एकमात्र तरीका Remove() विधियों में से एक का उपयोग करना है। हालांकि यह ऑपरेशन List<T> (O(1)O(n) के बजाय आइटम फॉर्म O(1)) को हटाने से तेज़ है, क्योंकि ऑपरेशन स्थानीय रूप से किया जा सकता है। हटाए गए आइटम के पीछे की वस्तुओं को स्थानांतरित नहीं किया जाना चाहिए, हटाए गए आइटम से पहले और बाद में केवल दो नोड्स को एक साथ जोड़ा जाना चाहिए। removed.Previous.Next = removed.Next; removed.Next.Previous = removed.Previous;। यह आंतरिक रूप से किया जाता है, क्योंकि Previous और Next गुण केवल पढ़ने के लिए हैं।

+2

जबकि 'निकालें (LinkedListNode )' वास्तव में ओ (1) है, 'निकालें (टी) 'ओ (एन) है, क्योंकि इसे आइटम को पहले हटाने के लिए ढूंढना है। – svick

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