鉴于代码:
var AllItems = new List<CartItem>();
using(var db = new MainContext())
{
foreach (var item in AllItems)
{
if (!db.tblStoreItems.Where(i => i.ID == item.ItemID).Any())
{
AllItems.Remove(item);
}
}
}
这是在循环中从List对象中删除项目的最佳方法吗?
答案 0 :(得分:9)
我不这么认为。如果从正在迭代的列表中删除项目,结果将是安全错误的。
最好以旧方式使用 - 以相反的顺序循环
using(var db = new MainContext())
{
for(int x = AllItems.Count - 1; x >= 0; x--)
{
var item = AllItems[x];
if (!db.tblStoreItems.Where(i => i.ID == item.ItemID).Any())
{
AllItems.RemoveAt(x);
}
}
}
答案 1 :(得分:7)
循环方法有几个问题,主要是 - 您无法从当前使用foreach
迭代的集合中删除项目 - 您将获得异常。
由于您的主要集合是List<T>
,因此您应该使用带有谓词的RemoveAll
方法。您还应该像这样简化查询:
AllItems.RemoveAll(item => !db.tblStoreItems.Any(i => i.ID == item.ItemID));
答案 2 :(得分:1)
这是错误的(OP的方法),正如史蒂夫提出的那样(史蒂夫的方式可能是性能方面最好的),
我更喜欢将'those to be removed'
存储到单独的列表中,然后您可以执行以下操作:
AllItems = AllItems.Except(Items2Remove);
从表现方式来看这不是最好的,但对我来说事情更清洁 - 你也可以结合LINQ枚举 - 例如从记录列表等中制作IEnumerable。
希望这会有所帮助 编辑:根据史蒂夫的回应澄清