C# datatable解决思路

C# datatable
有两个datatable:dt1,dt2  .                dt1和dt2里面的字段都是相同的,且里面都有pctime这一字段,但是dt1 里面的数据条数少于dt2里面的数据条数

现在我需要根据dt2里面pctime这一字段,跟dt1的pctime进行比较,看dt2里面哪一条数据的pctime与dt1最接近,然后将整条数据都替换掉。

这个应该怎么做?
------解决方案--------------------
你这个最接近是什么概念?时间差最小吗?
这个需要遍历dt1与dt2后再做比较。
还有一种办法,如果数据格式是一样的话,把dt1与dt2合并成一个table,然后按照pctime排序,最后再根据你要的条件做合并或者删除。
------解决方案--------------------
不错,是个好方法,再排序一下就更好了

DataView dv = dt.DefaultView;
            dv.Sort = "create_time";
            dtCopy = dv.ToTable();
------解决方案--------------------
引用:
Quote: 引用:

你这个最接近是什么概念?时间差最小吗?
这个需要遍历dt1与dt2后再做比较。
还有一种办法,如果数据格式是一样的话,把dt1与dt2合并成一个table,然后按照pctime排序,最后再根据你要的条件做合并或者删除。


不过第二种方法后面能在详细一点吗?


就是说你假设有三个列
id       name          time
1
2
3
4
5
如果是字段相同,就直接两张表加上去,不相同但只有TIME类型是相同的,那就dt.Columns.Add("Name", typeof(string));这样添加第二张表的列,然后再加上去,再按我上面的排序一下,就得到了理想的表了。你想合并啊删除什么的随你后面操作。
------解决方案--------------------
时间相减啊.
先把datatable里的数据取出来,转换成datetime类型
然后datetime-datetime=timespan
------解决方案--------------------
引用:
Quote: 引用:

[如果是字段相同,就直接两张表加上去,不相同但只有TIME类型是相同的,那就dt.Columns.Add("Name", typeof(string));这样添加第二张表的列,然后再加上去,再按我上面的排序一下,就得到了理想的表了。你想合并啊删除什么的随你后面操作。


之前合并表这个我能理解,但是就是后面对于合并后的表,我怎么判断原先dt2中的pctime与原先dt1中的哪一条pctime的值相差最小呢?(原先dt1中有一个字段status,里面全部为1,dt2中status字段全为2)

画个图给你看下你就知道了,下面是排序后的table的一部分:
pctime               stauts             
1                          1                           
1                          2
2                          2
4                          1
4                          1
5                          2
6                          1
先循环,如果status为2则continue,如果status为1则比较跟它i+1与i-1行的绝对值,看哪个大,记录下来。然后你注意下临界值,不让溢出就可以了。


------解决方案--------------------
引用:
Quote: 引用:

[如果是字段相同,就直接两张表加上去,不相同但只有TIME类型是相同的,那就dt.Columns.Add("Name", typeof(string));这样添加第二张表的列,然后再加上去,再按我上面的排序一下,就得到了理想的表了。你想合并啊删除什么的随你后面操作。


之前合并表这个我能理解,但是就是后面对于合并后的表,我怎么判断原先dt2中的pctime与原先dt1中的哪一条pctime的值相差最小呢?(原先dt1中有一个字段status,里面全部为1,dt2中status字段全为2)


id       status          time(排序字段)
1          1                  2014-5-8
2           2                 2014-5-7
3          1                  2014-5-7
4           2                 2014-5-6
5           1                 2014-5-6
......

明白了吗?你只用循环一次,如果status是1,则timespan比较它的前一条数据和后一条数据的timespan哪个小即为最近。注意i=0只比较后一条,i=datatable.rows.count时则只比较前一条。