Общий список RemoveAll и лямбда-выражения - PullRequest
2 голосов
/ 12 ноября 2009

Я явно что-то здесь упускаю ... У меня есть общий список объектов, и я пытаюсь использовать лямбда-выражение для удаления элементов. Когда я использую приведенный ниже код, я получаю следующее исключение.

System.InvalidOperationException: последовательность не содержит соответствующего элемента

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);
    }
}

Я ошибаюсь, используя лямбду?

[EDIT] Ну, провал на первый вопрос. Я неправильно прочитал трассировку стека, после удаления элемента в моем модульном тесте я попытался вызвать метод Get (), и в моем гневе «почему уже темно» бросило вызов при публикации вопроса без соответствующего анализа. К сожалению.

Ответы [ 3 ]

1 голос
/ 12 ноября 2009

"Sequence contains no matching element" это скорее вещь First(predicate) или Single(predicate) ... Я бы не ожидал увидеть это от RemoveAll. Вы уверены это в коде, размещенном?

Линия:

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

Работает без ошибок. Мне интересно, если вы звоните что-то вроде:

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

и бывает, что someQuery пуст.

0 голосов
/ 12 ноября 2009

Я предполагаю, что вы пытаетесь охватить случай, когда в списке появляется несколько элементов с одинаковым идентификатором (в противном случае просто используйте Удалить). Если это так, попробуйте сохранить лямбда как:

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

и вызывать myList.RemoveAll (pred), только если myList.Any (pred) имеет значение true.

0 голосов
/ 12 ноября 2009

Похоже, вы удаляете только один MyObject, переданный в метод. В этом случае вы можете изменить свой код на myList.Remove, а не на myList.RemoveAll

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...