2010-06-02 79 views
2

從EntitySet的卸下實體我有了這個代碼...看上去不錯,優雅,但顯然在通過它迭代框架不喜歡它,當我惹的集合:期間迭代

foreach (KitGroup kg in ProductToTransfer.KitGroups)  
{  
// Remove kit groups that have been excluded by the user  
if (inKitGroupExclusions != null && inKitGroupExclusions.Contains(kg.KitGroupID))  
    ProductToTransfer.KitGroups.Remove(kg);  
else  
{  
// Loop through the kit items and do other stuff  
//...  
}  
} 

當它遍歷集合中的第二個對象,它拋出的錯誤是:

我知道我可以創建KitGroup對象的一個​​新的集合(甚至只是標識)「EntitySet的枚舉過程中被修改」,我想刪除,然後再循環以循環這些,並將它們從集合中刪除,但這看起來像不必要的e xtra代碼......任何人都可以提出實現同樣目標的更優雅的方式嗎?

回答

12
foreach (KitGroup kg in ProductToTransfer.KitGroups.ToList())  
{  
// Remove kit groups that have been excluded by the user  
if (inKitGroupExclusions != null && inKitGroupExclusions.Contains(kg.KitGroupID))  
    ProductToTransfer.KitGroups.Remove(kg);  
else  
{  
// Loop through the kit items and do other stuff  
//...  
}  
} 

,或者如果KitGroups是List<T>已經類型的...

if(inKitGroupExclusion != null) 
    ProductToTransfer.KitGroups.RemoveAll(x => inKitGroupExclusion.Contains(x)); 
foreach (KitGroup kg in ProductToTransfer.KitGroups)  
{  
    // Loop through the kit items and do other stuff  
    //...  
} 

您還可以,如果你想定義RemoveAll()行爲與擴展方法使用第二種方法在另一個IEnumerable<T>。請確保您不要嘗試在LINQ實體表上使用RemoveAll(),因爲inKitGroupExclusion.Contains()不會被翻譯成SQL。

編輯:剛纔意識到它不是一個列表,只是一個EntitySet,所以你需要用第一種方法。

+0

哇真棒......我需要做的就是將它轉換爲列表。所以它只是因爲它是一個EntitySet,我無法刪除枚舉中的集合項......這是爲什麼? 感謝堆,我知道這將是一個簡單的解決方案這個問題:) – Jeeby 2010-06-02 06:08:08

+2

@Gregorius這不是事實,它是一個'EntitySet',這是事實,你是從你正在枚舉的對象中刪除。當你從原始的EntitySet中刪除時,調用'ToList'實例化一個新的'List'對象來枚舉。您將不得不使用相同的過程從「List」或任何其他集合中刪除項目。 – Jake 2010-06-02 06:10:43

+0

ahhh ...這很有道理。謝謝傑克,非常感謝 – Jeeby 2010-06-02 07:31:03