我有一个包含许多表的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();