2009-11-11 60 views
2

我很明顯缺少這裏的東西......我有一個通用的對象列表,我試圖使用lambda表達式來刪除項目。當我使用下面發佈的代碼時,我得到以下例外。通用列表RemoveAll和lambda表達式

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

我是不是用一種拉姆達的錯誤呢?

[編輯] 那麼第一個問題的翻牌。在我的單元測試中刪除項目後,我誤讀了堆棧跟蹤,我嘗試調用Get()方法,並在「爲什麼已經黑暗」的情況下憤怒跳過槍發佈沒有適當分析的問題。抱歉。

+1

您需要發佈更多的代碼...您發佈的代碼不會導致該異常.... –

回答

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是空的。

0

看來你只是刪除傳遞給方法的一個MyObject。如果是這種情況,你可以修改你的代碼來說myList.Remove,而不是myList.RemoveAll

0

我假設你正試圖掩蓋多個具有相同ID的項目出現在列表中的情況否則只需使用Remove)。如果是這樣,嘗試存儲拉姆達類似:

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

和來電myList.RemoveAll(預解碼)如果myList.Any(預解碼)是真實的。