我不明白为什么这段代码不起作用。
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
我不明白为什么这段代码不起作用。
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
最安全的方法 - 使用for
循环
for (int i = datatable.Rows.Count - 1; i >= 0; i--)
{
if (true)
{
datatable.Rows[i].Delete();
}
}
不要忘记AcceptChanges
删除所有标记的行:
datatable.AcceptChanges();
即使DataRow.Delete
不修改集合的状态,Microsoft 文档指出您不应在迭代集合时调用它:
在遍历 DataRowCollection 对象时,不应在 foreach 循环中调用 Delete 和 Remove。Delete 或 Remove 修改集合的状态。
最好的解决方案通常是为List<DataRow>
要删除的项目创建一个单独的集合(例如 a ),然后在完成迭代后删除它们。
这也是您想要从集合中删除项目的情况的解决方案,因为 .NET 中的大多数集合不允许您在迭代集合时更改集合的内容。
foreach
在使用语句对其进行迭代时,您无法修改集合。
你可以尝试这样的事情:
List<DataRow> deletedRows = new List<DataRow>();
foreach (DataRow dataRow in dataTable.Rows)
{
if(true) deletedRows.Add(dataRow);
}
foreach(DataRow dataRow in deletedRows)
{
dataRow.Delete();
}
如果你调用 delete 方法,你只需要AcceptChanges()
在 foreach 循环之后调用你正在修改的表。
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
dataTable.AcceptChanges();
delete 方法只是标记要删除的行。
http://msdn.microsoft.com/en-us/library/system.data.datarow.delete%28v=VS.90%29.aspx
可能是我的回答不再有用了。带有 DataRow 的 Foreach 中抛出的异常仅出现在 .Net 2.0 及更早版本中,原因是 msdn http://msdn.microsoft.com/en-us/library/system.data.datarow.delete(v=vs.80 ) 的描述).aspx
如果该行的 RowState 为已添加,则该行将从表中删除。
使用 Delete 方法后,RowState 变为 Deleted。在您调用 AcceptChanges 之前,它一直处于已删除状态。
可以通过调用 RejectChanges 取消删除已删除的行。
要解决这个问题,您可以在使用 foreach 之前调用 DataTable.AcceptChanges()
foreach (DataRow dataRow in dataTable.Rows)
{
if (true)
{
dataRow.Delete();
}
}
dataTable.AcceptChanges();
请参考快照以了解它的工作原理。
我希望这个问题现在得到解决。
如果Rows
删除一行,则在迭代时内容会发生变化,这会导致迭代无效。
但是,您可以先将行复制到集合中,然后遍历集合并以这种方式删除行。这确保迭代不会因更改要迭代的数据而中断。
实现此目的的最简单方法是使用 List 映射要删除的行,然后在 DataTable 迭代之外删除行。
C#
List<DataRow> rowsWantToDelete= new List<DataRow>();
foreach (DataRow dr in dt.Rows)
{
if(/*Your condition*/)
{
rowsWantToDelete.Add(dr);
}
}
foreach(DataRow dr in rowsWantToDelete)
{
dt.Rows.Remove(dr);
}
VB
Dim rowsWantToDelete As New List(Of DataRow)
For Each dr As DataRow In dt
If 'Your condition' Then
rowsWantToDelete .Add(dr)
End If
Next
For Each dr As DataRow In rowsWantToDelete
dt.Rows.Remove(dr)
Next
我刚刚使用的还有另一个版本(我认为更简单):
int i=0;
while (i < myDataTable.Rows.Count)
{
if (condition) //should it be deleted?
myDataTable.Rows.RemoveAt(i);
else
i++;
}
这更快。
仅针对像我这样正在寻找特定场景的人,我需要缩短花费的时间,并且一旦从每一行中提取了一些有用的信息,我就会通过标记为已删除来排除该行。
希望这可以帮助某人...
foreach (DataRow dataRow in dataTable.Rows)
{
if (dataRow.RowState != DataRowState.Deleted)
{
if (your condition here)
{
dataRow.Delete();
}
}
}
这几乎适用于任何收藏。如果您在遍历集合时尝试删除项目,您将遇到问题。例如,如果您删除第 3 行,则前第 4 行将变为第 3 行。
用这个:
for (int i = 0; i < myDataTable.Rows.Count; i++)
{
myDataTable[i].Delete();
}
在 items 有 的地方Count
,这就是我所做的:
int Count = myTable.Rows.Count;
while (Count > 0) // replace condition with myTable.Rows.Count if unconditionally performed on all rows
{
DataRow row = myTable.Rows[0] // or however you want to find your index
// do some work
myTable.Rows.Remove(row);
// if you want to perform a check to break out of while
if (someCondition)
Count = 0;
else
Count = myTable.Rows.Count;
}
请注意,在对象具有.GetXXXX()
集合的情况下,例如FileInfo
(IIRC),删除 a 中的项目内容foreach
是可以接受的。我考虑过的一个解决方案是创建一个提供方法的扩展.GetItems()
方法。
这是因为它看起来像是试图拆卸你爬楼梯的楼梯。简单地说,您不能删除您迭代的项目。
因此,您应该使用不同的数组来迭代并从数据表Rows
属性中删除它们。
foreach (DataRow dataRow in dataTable.Select())
{
if (true)
{
dataTable.Rows.Remove(dataRow);
}
}
肯定的Magents
这就是我的做法并且工作正常
dt = GetStationeryConsolidationDetails(txtRefNo.Text);
int intRows = dt.Rows.Count;
int x = 0;
for (int c = 0; c < intRows; c++)
{
if (dt.Rows[c - x]["DQTY"].ToString() == "0")
{
dt.Rows[c - x].Delete();
dt.AcceptChanges();
x++;
}
}