C# Delegate 函数总是对一半的数据集解析为 true

C# Delegate function always resolves true for half of Dataset

我正在尝试编写一种根据给定条件(委托)对 DataTable 进行分区的方法。我的问题是我使用的条件总是恰好将 DataTable 的一半进行分区。即使没有数据行应解析为真,条件似乎也为一半的数据行解析为真。

该方法如下所示:

private DataTable PartitionDataTable(DataTable data, Func<DataRow, bool> condition) {

DataTable removedRows = data.Clone();
for(int i = 0; i < data.Rows.Count; i++) {
  if(condition(data.Rows[i])){
    removedRows.ImportRow(data.Rows[i]);
    data.Rows.Remove(data.Rows[i]);
  }
}
  return removedRows;
}

我使用这个条件调用这个方法:

DataTable removed = PartitionDataTable(data, (row => DateTimeOffset.Parse(row["timestamp"].ToString()) < baselineTimestamp);

如果数据对象 (DataTable) 中的 highest/max 时间戳比 'baselineTimestamp' 早几分钟,使用 data.Compute("max([timestamp])", String.Empty) 确定,那么一半的记录仍然被分区和删除当 none 应该是因为它们都是 < baselineTimestamp.

不知道发生了什么。请帮我。目标是使用早于给定时间戳(精确到毫秒)的时间戳对 DataRows 进行分区。

每次从 data 中删除一行,它的 Rows.Count 就会减少。

假设 data 开头包含 10 行。

您将 i 增加到 5,同时从 data 中删除 5 行。

下一次迭代,i为6,data.Rows.Count为5,循环终止。

您在遍历数据集时删除了行。因此,如果 i=2,则您删除第 2 行,而第 3 行现在是第 2 行。然后您递增 i,对新的第 3 行(即第 4 行)进行操作,从而跳过原始第 3 行一共

解决此问题的一个技巧是向后迭代,因为移动的行是您已经处理过的行:

for(int i = data.Rows.Count-1; i >= 0; i--) {
  if(condition(data.Rows[i])){
    removedRows.ImportRow(data.Rows[i]);
    data.Rows.Remove(data.Rows[i]);
  }
}
  return removedRows;
}

由于要从数组中删除元素,因此必须向后移动。如果你向前做,你会跳过一半的元素,这就是你得到一半的原因:

DataTable removedRows = data.Clone();
for(int i = data.Rows.Count-1; i >= 0 ; i--) {
  if(condition(data.Rows[i])){
    removedRows.ImportRow(data.Rows[i]);
    data.Rows.Remove(data.Rows[i]);
  }
}
  return removedRows;
}