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

时间:2018-10-01 18:39:15

标签: c#

我有一个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,该操作也会失败,并显示“集合已修改;枚举操作可能无法执行”。那么,如何清除表中的行却保留表本身(例如其主键等)?

2 个答案:

答案 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();