我在这里显然遗漏了一些东西...我有一个通用的对象列表,我正在尝试使用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在未经适当分析的情况下发布了一个问题。遗憾。
答案 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)。