2 Stimmen

Generische Liste RemoveAll und Lambda-Ausdrücke

Ich übersehe hier eindeutig etwas... Ich habe eine allgemeine Liste von Objekten und ich versuche, einen Lambda-Ausdruck zu verwenden, um Elemente zu entfernen. Wenn ich den unten geposteten Code verwende, erhalte ich die folgende Ausnahme.

System.InvalidOperationException: Sequenz enthält kein passendes Element

public class MyObject {
    public Guid ID1 {get;set;}
    public int ID2 {get;set;}
}

public class MyContainer{
    List<MyObject> myList = new List<MyObject>();

    public MyObject Get(Guid id1) {
        return myList.Single(mo => mo.ID1 == id1);
    }

    public void AddItem(MyObject item) {
        myList.Add(item);
    }

    public int RemoveItems(MyObject item) {
        return myList.RemoveAll(mo => mo.ID1 == item.ID1 || mo.ID2 == item.ID2);
    }
}

Mache ich einen Fehler, wenn ich ein Lambda verwende?

[EDIT] Nun ein Flop für die erste Frage. Ich habe den Stack-Trace falsch gelesen, nachdem ich das Element in meinem Unit-Test entfernt hatte, habe ich versucht, die Get()-Methode aufzurufen, und in meiner "warum ist es schon dunkel draußen"-Wut habe ich vorschnell eine Frage ohne angemessene Analyse gestellt. Entschuldigung.

1 Stimmen

Sie müssen mehr Code posten...der Code, den Sie gepostet haben, würde diese Ausnahme nicht verursachen....

1voto

Marc Gravell Punkte 970173

"Sequence contains no matching element" ist eher ein First(predicate) o Single(predicate) Sache... Ich würde das nicht erwarten von RemoveAll . Sind Sie sicher steht es in dem veröffentlichten Code?

Die Linie:

new MyContainer().RemoveItems(new MyObject { ID1 = Guid.Empty, ID2 = 2 });

Läuft ohne jeden Fehler. Ich frage mich, ob Sie etwas wie aufrufen:

col.RemoveItems(someQuery.Single(predicate));

und es kommt vor, dass someQuery leer ist.

0voto

Alexis Abril Punkte 6279

Es scheint, dass Sie nur das eine MyObject entfernen, das an die Methode übergeben wird. Wenn dies der Fall ist, können Sie Ihren Code so ändern, dass er myList.Remove anstelle von myList.RemoveAll sagt

0voto

nitzmahone Punkte 13384

Ich nehme an, dass Sie versuchen, den Fall abzudecken, dass mehrere Elemente mit der gleichen ID in der Liste erscheinen (andernfalls verwenden Sie einfach Remove). Wenn ja, versuchen Sie, das Lambda wie zu speichern:

Expression<Func<MyObject, bool>> pred = (mo) => mo.ID1 == item.ID1 || mo.ID2 == item.ID2

und rufen myList.RemoveAll(pred) nur auf, wenn myList.Any(pred) wahr ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X