Benutzer mit den meisten Antworten
Delegat mit Parameter(n)

Frage
-
Hallo!
Ich möchte aus einer Liste liDataList<string> alle Einträge, die in einer anderen Liste liBlackList<string> definiert sind, löschen.
Dazu gehe ich die BlackList durch und möchte mit RemoveAll alle Einträge, die dem akt. Eintrag in der BlackList entsprechen, aus der DataList löschen.
foreach (string zEintrag in liBlackList) liDataList.RemoveAll(prfBlackList); // Die Bilder-BlackList durchgehen um die relevanten Einträge in der Datei-Liste zu entfernen
Mein Problem ist nun, dass ich dem Delegate ein Parameter (mit) übergeben muss (den Vergleichs-Begriff).
In der Hilfe (MS) sind immer nur Beispiele aufgeführt, wo der Delegate seine
Entscheidung (true/false) aus dem Inhalt des ListEintrages selbst erstellen kann,
dieser also nicht von Parameter(n) abhängig ist.Delegate-Funktion:
bool prfBlackList(string uzliEintrag)
{
return liBlackList.Contains(System.IO.Path.GetFileName(uzliEintrag));
}Ich schaffe es nicht, im Delegate einen weiteren Parameter zu definieren so etwa:
foreach (string zEintragBL in liBlackList) liDataList.RemoveAll(prfBlackList(zliEintrag, zEintragBL));
...bool prfBlackList(string uzliEintrag, string uzEintragBL)
{
return System.IO.Path.GetFileName(uzliEintrag)==uzEintragBL;
}
Wie könnte man das lösen???Fred.
Antworten
-
Hallo
Du könntest es aber im Prinzip ganz einfach lösen, mit Except oder auch indem Du
Eine weiteren Parameter kannst Du an dieser Stelle nicht definieren.
Die Signatur von RemoveAll akzeptiert genau einen Parameter, ein Predicate<T>,
Ein Predicate<T> akzeptiert seinserseits nur einen Parameter, der vom selben Typ sein muss
wie die List<T>, bei Dir string. Das kann ma nicht aufbohren.
in RemoveAll eben einfach auf die BlackList zugreifst:
List<string> strings = new List<string> { "abc", "def", "ghi", "jkl" }; List<string> blacklist = new List<string> { "abc", "jkl" }; List<string> ohneBlackList = strings.Except(blacklist).ToList(); //Wenn Du es mit RemoveAll machen möchtest ginge es so: List<string> strings = new List<string> { "abc", "def", "ghi", "jkl" }; List<string> blacklist = new List<string> { "abc", "jkl" }; int result = strings.RemoveAll(s => blacklist.Any(black => s == black));
Christoph- Als Antwort vorgeschlagen Techtwebty Donnerstag, 17. März 2011 15:07
- Als Antwort markiert perlfred Montag, 21. März 2011 14:02
Alle Antworten
-
Hallo
Du könntest es aber im Prinzip ganz einfach lösen, mit Except oder auch indem Du
Eine weiteren Parameter kannst Du an dieser Stelle nicht definieren.
Die Signatur von RemoveAll akzeptiert genau einen Parameter, ein Predicate<T>,
Ein Predicate<T> akzeptiert seinserseits nur einen Parameter, der vom selben Typ sein muss
wie die List<T>, bei Dir string. Das kann ma nicht aufbohren.
in RemoveAll eben einfach auf die BlackList zugreifst:
List<string> strings = new List<string> { "abc", "def", "ghi", "jkl" }; List<string> blacklist = new List<string> { "abc", "jkl" }; List<string> ohneBlackList = strings.Except(blacklist).ToList(); //Wenn Du es mit RemoveAll machen möchtest ginge es so: List<string> strings = new List<string> { "abc", "def", "ghi", "jkl" }; List<string> blacklist = new List<string> { "abc", "jkl" }; int result = strings.RemoveAll(s => blacklist.Any(black => s == black));
Christoph- Als Antwort vorgeschlagen Techtwebty Donnerstag, 17. März 2011 15:07
- Als Antwort markiert perlfred Montag, 21. März 2011 14:02
-
Hallo Christoph!
Warum kann die MS-Hilfe nicht genau so logisch und mit einfachen Worten Sachverhalte darstellen wie es deine Antwort macht?!
"Die Signatur von RemoveAll akzeptiert genau einen Parameter, ein Predicate<T>. Ein Predicate<T> akzeptiert seinserseits nur einen Parameter, der vom selben Typ sein muss wie die List<T>..."
Ich habe es zwischenzeitlich ein wenig anders gelöst und zum Vergleich eine globale Variable bemüht, aber deine Lösungen sind sauberer!
Except ist ja ganz interessant!...Differenzmenge zweier Sequenzen...!
Vielen Dank! für deine Antwort.
Fred.