标题可能很难理解,所以这里有一个简短的解释:我必须创建一个方法:
MergeDataset(byval ds as Dataset) 作为数据集
- 数据表有多行
- 列:startDate、endDate 和其他多个
数据集按 startDate 排序
我现在应该做什么 :
- 我创建了一个数据集的克隆,当然它是空的
我遍历数据表中的每个数据行
如果数据行在克隆数据集中的值等于所有列(开始日期和结束日期除外)并且克隆的结束日期等于数据行的开始日期 - 1 天
否则该行被添加到克隆
现在这已正确完成,但需要很多时间。当我有一个 100 000 行的数据集时,将它们全部合并需要几个小时。
这里有一些代码:
Dim mergeSet As DataSet = dsSubscriptions.Clone()
Dim dr() As DataRow = ds.Tables("resultTable").Select("","startDate")
For Each sourceRow As DataRow In dr
If mergeSet.Tables("resultTable").Rows.Count > 0 Then
Dim foundRows As DataRow() = mergeSet.Tables("resultTable").Select(endDate=startDate-1 and value1 = value1 and value2 = value2 and value3 = value3)
'If nothing in foundRows -> Add row
For Each resultrow As DataRow In foundRows
resultrow("endDate") = CDate(sourceRow("endDate"))
next
else
'Add row
Next
如果我检查时间跨度它们会增加很多,那么在选择 mergeSet 时会浪费很多时间。select 有 5 个唯一值,如果所有值相等,则可以合并行,并且可以将日期合并为一个句点。
小例子:
id startDate endDate value1 value2 value3
1 2012 年 1 月 11 日 2012 年 11 月 30 日 ABC 添加到合并
2 2012 年 1 月 12 日 2012 年 12 月 31 日 ABC 与 1 合并
3 1-1-2013 31-1-2013 ABB 添加到合并(与 2 不同的值)
欢迎任何帮助!亲切的问候