,因爲雖然它遍歷集合不能改變你得到這個錯誤。要從集合中刪除某些項目,通常需要第二個迭代集合,而不更改它。
對於您的DataTable
,您需要首先獲取要刪除的行並將其放入新集合中。實現這一目標的方法之一是LINQ
:
讓我們創建一些測試數據:
DataTable dt = new DataTable();
dt.Columns.Add("Test", typeof(bool));
DataRow dr1 = dt.NewRow();
DataRow dr2 = dt.NewRow();
DataRow dr3 = dt.NewRow();
dr1["Test"] = true;
dr2["Test"] = false;
dr3["Test"] = false;
dt.Rows.Add(dr1);
dt.Rows.Add(dr2);
dt.Rows.Add(dr3);
則只能得到行,其中在Test
列值是false
,並把它們放在一個List<DataRow>
:
var removeRows =
dt
.AsEnumerable()
.Where(r => (bool)r["Test"] == false)
.ToList();
現在您可以迭代新的removeRows
列表並從第一個集合中刪除它的項目(這裏是DataTable.Rows
)
// Remove selected rows.
foreach (var row in removeRows)
{
dt.Rows.Remove(row);
}
在你的這個查詢應該工作:
var removeRows =
dtapple
.AsEnumerable()
.Where(r => string.IsNullOrEmpty(r["PassportExpDate"].ToString()) == false)
.ToList();
如果使用string.IsNullOrEmpty()
沒有必要Trim()
它。
[錯誤數據行的可能重複,集合被修改;枚舉操作可能不會執行](http://stackoverflow.com/questions/15457571/error-in-datarow-collection-was-modified-enumeration-operation-might-not-execut) –
鏈接問題的解決方案是可怕的。用臨時DataTables和嵌套循環: - \ – t3chb0t
那麼,你有沒有解決它? – t3chb0t