vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
sevAniGif - als kostenlose Vollversion auf unserer vb@rchiv CD Vol.5  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Nachtrag zu RemoveAll() 
Autor: Preisser
Datum: 04.12.11 13:47

Hallo,

da wir grade beim Thema sind, ein kurzer Nachtrag :

Die List(T).RemoveAll(Predicate(T))-Methode, wie von Manfred vorgeschlagen, ist tatsächlich effizienter als z.B. in einer Schleife die Liste rückwärts zu durchlaufen und einzelne Elemente mit .RemoveAt(index) zu entfernen, denn bei dieser Variante würden jedes Mal, wenn ein Element entfernt wird, alle nachfolgenden Elemente um 1 nach vorne verschoben werden müssen, womit dies ein O(n²)-Vorgang sein müsste (die Anzahl der Operationen wächst quadratisch zur Anzahl der Listenelemente).

Die RemoveAll()-Methode dagegen benutzt das interne Array der Liste, in dem die Elemente gespeichert sind, und sucht zuerst das erste zu löschende Element heraus ("freeIndex"). Danach wird das erste Element gesucht, das nach freeIndex kommt und nicht zu löschen ist ("current"), und dieses Element wird an die Position freeIndex kopiert; anschließend wird freeIndex um 1 erhöht. In einer Schleife wird dann wieder das nächste, nicht zu löschende Element gesucht, welches wiederrum an die Position freeIndex kopiert wird, bis das komplette listen-interne Array durchlaufen wurde. Hierbei handelt es sich also nur um einen O(n)-Vorgang (die Anzahl der Operationen wächst linear zur Anzahl der Elemente).

Dies kann man im Quellcode der RemoveAll()-Methode sehen:
        // This method removes all items which matches the predicate.
        // The complexity is O(n). 
        public int RemoveAll(Predicate<T> match) {
            if( match == null) { 
                ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match); 
            }
            Contract.Ensures(Contract.Result<int>() >= 0); 
            Contract.Ensures(Contract.Result<int>() <= Contract.OldValue(Count));
            Contract.EndContractBlock();
 
            int freeIndex = 0;   // the first free slot in items array 
 
            // Find the first item which needs to be removed. 
            while( freeIndex < _size && !match(_items[freeIndex])) freeIndex++; 
            if( freeIndex >= _size) return 0;
 
            int current = freeIndex + 1;
            while( current < _size) {
                // Find the first item which needs to be kept.
                while( current < _size && match(_items[current])) current++; 
 
                if( current < _size) { 
                    // copy item to the free slot. 
                    _items[freeIndex++] = _items[current++];
                } 
            }
 
            Array.Clear(_items, freeIndex, _size - freeIndex);
            int result = _size - freeIndex; 
            _size = freeIndex;
            _version++; 
            return result; 
        }


Beitrag wurde zuletzt am 04.12.11 um 13:48:30 editiert.
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
ArrayList Count2.2572Net01.12.11 21:21
Re: ArrayList Count1.759Preisser01.12.11 21:42
Re: ArrayList Count1.6982Net01.12.11 22:58
Re: ArrayList Count1.806Manfred X01.12.11 23:59
Re: ArrayList Count1.6792Net02.12.11 00:31
Re: ArrayList Count1.6232Net02.12.11 08:01
Re: ArrayList Count1.664ModeratorRalfE02.12.11 09:22
Warnung: List.ForEach nicht mit List.Remove kombinieren!1.667Manfred X03.12.11 20:09
Alternative: RemoveAll1.677Manfred X04.12.11 00:12
Re: Warnung: List.ForEach nicht mit List.Remove kombinieren!1.5852Net04.12.11 11:59
Re: Warnung: List.ForEach nicht mit List.Remove kombinieren!1.652Manfred X04.12.11 12:26
Re: Warnung: List.ForEach nicht mit List.Remove kombinieren!1.627Preisser04.12.11 12:36
Re: Warnung: List.ForEach nicht mit List.Remove kombinieren!1.6832Net04.12.11 12:43
Nachtrag zu RemoveAll()1.773Preisser04.12.11 13:47

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2025 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel