C# DataTable.Rows.Clear() 不清除行



我有一个包含许多表的DataSet dsComponents所有这些表都只在内存中,我不将它们与任何数据库同步。在某些时候,我需要删除所有行以释放一些内存,但该功能似乎不起作用(基于此答案(

if(dsComponents.Tables.Contains("MemoryHistory"))
{
dsComponents.Tables["MemoryHistory"].Rows.Clear();
}

但是,如果我在此代码之后立即中断,则表明表中仍有所有行。我也试过:

if(dsComponents.Tables.Contains("MemoryHistory"))
{
lock(dsComponents.Tables["MemoryHistory"])
{
foreach (DataRow row in dsComponents.Tables["MemoryHistory"].Rows)
{
row.Delete();
}
}
dsComponents.Tables["MemoryHistory"].Rows.Clear();
}

而这个失败了,并显示"集合已被修改;枚举操作可能无法执行",即使使用lock。那么,如何清除表的行但保留表本身(如其主键等(?

这里的问题是您在迭代枚举时正在修改

枚举,这是不允许的。您需要重置表上的行属性,而不循环访问行。

想想像迭代List<T>

你不会做

foreach (var element in list)
{
list.Remove(element);
}

相反,您可以执行以下操作:

list.Clear();

在您的情况下,您会想做

dsComponents.Tables["MemoryHistory"].Rows.Clear();

我不确定您是否需要锁定对象,但如果您澄清这一点,我很乐意修改我的答案。

只是做

dsComponents.Tables["MemoryHistory"].Clear();

最新更新