如何最好地删除C#循环中的列表项

时间:2012-04-14 12:34:48

标签: c# asp.net list loops

鉴于代码:

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对象中删除项目的最佳方法吗?

3 个答案:

答案 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。

希望这会有所帮助 编辑:根据史蒂夫的回应澄清