La collection a été modifiée. opération d’énumération peut ne pas s’exécuter lors d’une opération exceptée

J’essaie de supprimer certaines lignes de mon DataTable dt dans une boucle où j’obtiens l’exception ci-dessus:

 while (dt.Rows.Count > 0 && retry < Globals.PushRetryLimit) { var query = dt.AsEnumerable().Except(successBatch.AsEnumerable(), DataRowComparer.Default) .AsEnumerable().Except(failBatch.AsEnumerable(), DataRowComparer.Default); if (dt.AsEnumerable().Any()) dt = query.CopyToDataTable(); } 

successBatch et failBatch sont tous deux des clones DataTable de dt .

Dans les autres questions où cette erreur a été posée, nous avons affaire à une boucle foreach . Pourquoi cette erreur se produit?

Trace de la stack:

  at System.Data.DataTableExtensions.LoadTableFromEnumerable[T](IEnumerable`1 source, DataTable table, Nullable`1 options, FillErrorEventHandler errorHandler) at System.Data.DataTableExtensions.CopyToDataTable[T](IEnumerable`1 source) 

Vous modifiez les éléments de la collection (votre table de données) en effectuant une boucle avec foreach.

Foreach interroge l’énumérateur et demande le prochain élément. Si vous supprimez un élément, l’état de l’énumérateur devient invalide. Un énumérateur doit stocker une date indiquant où se trouve sa position actuelle.

Tu ne devrais pas faire ça. Peut-être utiliser une autre collection pour suivre les modifications ou utiliser des collections simultanées (pour en savoir plus sur les classes dans le lien)