Sto vedendo vari frammenti della risposta giusta qui, ma lasciami mettere insieme tutto e spiegare un paio di cose.
Prima di tutto, AcceptChangesdovrebbe essere utilizzato solo per contrassegnare l'intera transazione su una tabella come convalidata e impegnata. Ciò significa che se si utilizza DataTable come DataSource per l'associazione, ad esempio, a un server SQL, la chiamata AcceptChangesmanuale garantirà che le modifiche non vengano mai salvate sul server SQL .
Ciò che rende questo problema più confuso è che in realtà ci sono due casi in cui viene lanciata l'eccezione e dobbiamo prevenirli entrambi.
1. Modifica di una raccolta di IEnumerable
Non è possibile aggiungere o rimuovere un indice alla raccolta da enumerare perché ciò potrebbe influire sull'indicizzazione interna dell'enumeratore. Esistono due modi per aggirare questo problema: eseguire la propria indicizzazione in un ciclo for o utilizzare una raccolta separata (che non viene modificata) per l'enumerazione.
2. Tentativo di leggere una voce eliminata
Poiché le DataTable sono raccolte transazionali , le voci possono essere contrassegnate per l'eliminazione ma vengono comunque visualizzate nell'enumerazione. Ciò significa che se chiedi una voce eliminata per la colonna "name", verrà generata un'eccezione. Il che significa che dobbiamo controllare per vedere sedr.RowState != DataRowState.Deleted prima di interrogare una colonna.
Mettere tutto insieme
Potremmo creare confusione e fare tutto questo manualmente, oppure possiamo lasciare che DataTable faccia tutto il lavoro per noi e rendere l'istruzione più simile a una chiamata SQL procedendo come segue:
string name = "Joe";
foreach(DataRow dr in dtPerson.Select($"name='{name}'"))
dr.Delete();
Chiamando la Selectfunzione di DataTable , la nostra query evita automaticamente le voci già eliminate in DataTable. E poiché la Selectfunzione restituisce un array di corrispondenze, la raccolta su cui stiamo enumerando non viene modificata quando la chiamiamo dr.Delete(). Ho anche ravvivato l'espressione Select con l'interpolazione di stringhe per consentire la selezione delle variabili senza rendere il codice rumoroso.
[ii]in[i]:-)