【问题标题】:Error while removing item from collection从集合中删除项目时出错
【发布时间】:2014-09-06 14:35:43
【问题描述】:

出现错误收藏已被修改;枚举操作可能无法执行。

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);
    }          
}

【问题讨论】:

  • 您不能在迭代集合时修改它!喜欢 var toUpdateItm = MC_CRM_T001A.ItemDetails.Where(X => X.CatNo == SelectedCRM_T001A.CatNo).ToList();
  • 代码是否必须修改现有集合?您可以非常轻松地创建一个只包含您想要的项目的新集合,然后用新集合替换原始集合。

标签: c# linq collections


【解决方案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);
  }

你也不需要两个循环。

【讨论】:

    猜你喜欢
    • 2015-11-02
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2013-01-17
    • 2012-12-18
    相关资源
    最近更新 更多