Sto vedendo vari frammenti della risposta giusta qui, ma lasciami mettere insieme tutto e spiegare un paio di cose.
Prima di tutto, AcceptChanges
dovrebbe 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 AcceptChanges
manuale 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 Select
funzione di DataTable , la nostra query evita automaticamente le voci già eliminate in DataTable. E poiché la Select
funzione 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]
:-)