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

Tom*_*len 6 c# asp.net loops list

鉴于代码:

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这是从循环中的List对象中删除项目的最佳方法吗?

Ste*_*eve 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); 
        } 
    } 
}
Run Code Online (Sandbox Code Playgroud)


Iga*_*nik 7

循环方法有几个问题,主要是 - 您无法从当前正在迭代的集合中删除项目foreach- 您将获得异常.

由于您的主集合是a List<T>,因此您应该使用RemoveAll带有谓词的方法.您还应该像这样简化查询:

AllItems.RemoveAll(item => !db.tblStoreItems.Any(i => i.ID == item.ItemID));
Run Code Online (Sandbox Code Playgroud)