我有一个DataSet dsComponents
,其中包含许多表,它们都仅在内存中,我不将它们与任何数据库同步。有时我需要删除所有行以释放一些内存,但该功能似乎无法正常工作(基于this answer)
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
,该操作也会失败,并显示“集合已修改;枚举操作可能无法执行”。那么,如何清除表中的行却保留表本身(例如其主键等)?
答案 0 :(得分:2)
这里的问题是,您正在遍历它时正在修改一个Enumerable,这是不允许的。
您需要在不迭代行的情况下重置表上的rows属性。
想像遍历List<T>
你不会
foreach (var element in list)
{
list.Remove(element);
}
相反,您将执行以下操作:
list.Clear();
您要这样做
dsComponents.Tables["MemoryHistory"].Rows.Clear();
我不确定您是否需要锁定对象,但是如果您明确说明,我很乐意修改答案。
答案 1 :(得分:1)
只需
dsComponents.Tables["MemoryHistory"].Clear();