Golden Basim Ответов: 3

Коллекция была изменена; операция перечисления может не выполняться. В foreach


я пытаюсь получить данные (данные фондов) и отфильтровать результаты по их балансу

но эта ошибка появляется :

System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.'



at <pre> foreach (account_funds f in account_Funds)


Что я уже пробовал:

public void loadFunds()
      {


          mrsalesdbEntities DB01 = ConnectionTools.OpenConn();
          var account_Funds = DB01.account_funds.Where(u => u.accfunds_CustodyType == 1 && u.r_branche_ID == BasicVars.Branche).ToList();
          foreach (account_funds f in account_Funds)
          {
              if (trsBalance(f.accfunds_ID) == 0) { account_Funds.Remove(f); }
          }
          account_fundsBindingSource.DataSource = account_Funds;
          NameInput.EditValue = account_Funds.FirstOrDefault().accfunds_ID;

      }


public decimal trsBalance(int ID)
       {
           decimal blc = 0;
           if (ID != 0)
           {
               var DB1 = ConnectionTools.OpenConn();
               var account = DB1.account_items.Where(u => u.accitem_TrsID == ID && u.accitem_TrsType == 0 && u.accitem_AccID == 60);
               decimal debet = Convert.ToDecimal(account.Sum(s => s.accitem_Debit));
               decimal credit = Convert.ToDecimal(account.Sum(s => s.accitem_Credit));
               blc = debet - credit;
           }
           return blc.GetDecimalParts();
       }

3 Ответов

Рейтинг:
8
Рейтинг:
1

phil.o

Вы не можете перечислить коллекцию в блоке foreach и изменить ее в том же блоке.
Обычно решение состоит в том, чтобы вернуться к простой старой итерации индекса, начиная с конца коллекции. В чистом виде, перемены

foreach (account_funds f in account_Funds)
{
   if (trsBalance(f.accfunds_ID) == 0) { account_Funds.Remove(f); }
}
к
for (int i = account_Funds.Count - 1; i > -1; --i)
{
   var f = account_Funds[i];
   if (trsBalance(f.accfunds_ID) == 0) { account_Funds.RemoveAt(i); }
}


Рейтинг:
0

F-ES Sitecore

Вместо того чтобы исполнять

account_Funds.Remove(f);


храните коллекцию всех элементов, которые вы хотите удалить;

var toRemove = new List<account_funds>();
foreach (account_funds f in account_Funds)
          {
              if (trsBalance(f.accfunds_ID) == 0) { toRemove.Add(f); }
          }


после цикла foreach, то вы можете удалить элементы, в удаление от account_Funds.