从集合中删除项目时出错

时间:2014-09-06 06:04:17

标签: c# linq collections

获取错误收集已修改;枚举操作可能无法执行。

var toUpdateItm = MC_CRM_T001A.ItemDetails
    .Where(X => X.CatNo == SelectedCRM_T001A.CatNo);
foreach (var itm in toUpdateItm)
{                       
    int x = MC_CRM_T001A.PartDetails.IndexOf(MC_CRM_T001A.PartDetails
        .Where(X => X.cat_item_id == itm.id)
        .FirstOrDefault()
    );
    if (x >= 0 && x!=null)
    {
        MC_CRM_T001A.PartDetails.RemoveAt(x);                    
    }             
}

foreach (var itm in toUpdateItm)
{
    if (itm.CatNo == SelectedCRM_T001A.CatNo)
    {
        MC_CRM_T001A.ItemDetails.Remove(itm);
    }          
}

1 个答案:

答案 0 :(得分:1)

您无法修改正在循环的列表。将foreach调用更改为foreach (var itm in toUpdateItem.ToList()),这将创建列表的副本。

此外,如果没有所有IndexOf内容,您可以更干净地表达此代码:

 var toUpdateItm = MC_CRM_T001A.ItemDetails.Where(X => X.CatNo == SelectedCRM_T001A.CatNo).ToList();
foreach (var itm in toUpdateItm.ToList())
  {
    var item = MC_CRM_T001A.PartDetails.FirstOrDefault(X => X.cat_item_id == itm.id);
    if (item != null) { MC_CRM_T001A.PartDetails.Remove(item); }
    if (itm.CatNo == SelectedCRM_T001A.CatNo) { MC_CRM_T001A.ItemDetails.Remove(itm);
  }

你也不需要两个循环。

相关问题