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;
}
我正在尝试编写一种根据给定条件(委托)对 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;
}