通用列表RemoveAll和lambda表达式

时间:2009-11-11 22:10:32

标签: c# lambda

我在这里显然遗漏了一些东西...我有一个通用的对象列表,我正在尝试使用lambda表达式来删除项目。当我使用下面发布的代码时,我得到以下异常。

  

System.InvalidOperationException:Sequence不包含匹配元素

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

我使用lambda犯了错误吗?

[编辑] 第一个问题是翻牌。我误读了堆栈跟踪,在我的单元测试中删除了项目之后,我试图调用Get()方法,在我的“为什么它已经黑了”中,rage在未经适当分析的情况下发布了一个问题。遗憾。

3 个答案:

答案 0 :(得分:1)

"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为空。

答案 1 :(得分:0)

您似乎只删除了传递给方法的MyObject。如果是这种情况,您可以将代码修改为myList.Remove而不是myList.RemoveAll

答案 2 :(得分:0)

我假设你试图覆盖列表中出现多个具有相同ID的项目(否则只使用Remove)。如果是这样,请尝试将lambda存储为:

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

如果myList.Any(pred)为true,则只调用myList.RemoveAll(pred)。