2014-09-06 3 views
1

Получение ошибки Коллекция была изменена; операция перечисления может не выполняться.Ошибка при удалении элемента из коллекции

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

Вы не можете изменить коллекцию во время итерации по ней! Сделайте как var toUpdateItm = MC_CRM_T001A.ItemDetails.Where (X => X.CatNo == SelectedCRM_T001A.CatNo) .ToList(); –

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

Вам не нужно две петли либо.

Смежные вопросы