none
Delegat mit Parameter(n) RRS feed

  • 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.

    Donnerstag, 17. März 2011 11:48

Antworten

  • Hallo

    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.

    Du könntest es aber im Prinzip ganz einfach lösen, mit Except oder auch indem Du
    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
    Donnerstag, 17. März 2011 12:25

Alle Antworten

  • Hallo

    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.

    Du könntest es aber im Prinzip ganz einfach lösen, mit Except oder auch indem Du
    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
    Donnerstag, 17. März 2011 12:25
  • 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.

     

    Montag, 21. März 2011 14:37