Erweiterungsmethoden DictionaryTKey, TValue.RemoveAll? Ist es möglich?

7

Ich habe versucht, eine Erweiterungsmethode zu schreiben, um List.RemoveAll (Prädikat) nachzuahmen.

Bisher habe ich das:

%Vor%

Irgendwelche Zeiger? Ist das eine völlig naive Umsetzung?

    
Rob Stevenson-Leggett 17.03.2009, 14:16
quelle

4 Antworten

16

Ihr Code wird nicht funktionieren, da Sie die Dictionary-Klasse nach Wert übergeben. Dies bedeutet, dass die endgültige Zuweisung (dict = temp) für eine aufrufende Funktion nicht sichtbar ist. In C # ist es nicht erlaubt, die Ziele der Erweiterungsmethode mit ref oder out zu übergeben (in VB ist ByRef legal).

Stattdessen müssen Sie das Dictionary inline ändern. Probieren Sie Folgendes aus

%Vor%

BEARBEITEN

Die Reihenfolge von Where und ToList wurde vertauscht, um die Größe des zugewiesenen Speichers der Liste zu reduzieren. Es wird jetzt nur eine Liste für die Elemente zugeordnet, die entfernt werden sollen.

    
JaredPar 17.03.2009, 14:20
quelle
4
%Vor%

Wenn die Anzahl der zu entfernenden Schlüssel im Verhältnis zur Wörterbuchgröße klein ist, ist dies schneller (wenn die entfernte Zahl wahrscheinlich Null ist, können Sie dies noch schneller machen, indem Sie auch die toRemove-Liste erstellen.

Dies läuft genauso ab wie die aktualisierte Antwort von Jared, erlaubt es Ihnen jedoch, die Erstellung der Entfernungsliste zu verschieben, wenn Sie dies wünschen. Wenn das kein Problem ist (und Sie haben keinen Grund, während des Prozesses zu brechen) dann ist Jareds sauberer und einfacher.

    
ShuggyCoUk 17.03.2009 14:21
quelle
1

Diese Methode funktioniert nicht, weil der Parameter "dict" nicht als Referenz übergeben wird, und kann auch nicht sein, weil ref nicht als erster Parameter einer Erweiterungsmethode unterstützt wird.

%Vor%

Ich möchte auch die Implementierungen von RemoveAllByKey und RemoveAllByValue sehen.

    
Dustin Campbell 17.03.2009 14:23
quelle
0

Aber wenn Sie wollten, könnten Sie ein neues und anderes Wörterbuch zurückgeben. Ihre Signatur würde sich folgendermaßen ändern:

%Vor%

Und der aufrufende Code würde sagen:

%Vor%

Und wenn Sie oldDict ändern wollten, würden Sie es so nennen:

%Vor%     
Charlie Flowers 19.03.2009 20:59
quelle