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();
------解决方案--------------------
就是说你假设有三个列
id name time
1
2
3
4
5
如果是字段相同,就直接两张表加上去,不相同但只有TIME类型是相同的,那就dt.Columns.Add("Name", typeof(string));这样添加第二张表的列,然后再加上去,再按我上面的排序一下,就得到了理想的表了。你想合并啊删除什么的随你后面操作。
------解决方案--------------------
时间相减啊.
先把datatable里的数据取出来,转换成datetime类型
然后datetime-datetime=timespan
------解决方案--------------------
画个图给你看下你就知道了,下面是排序后的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行的绝对值,看哪个大,记录下来。然后你注意下临界值,不让溢出就可以了。
------解决方案--------------------
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时则只比较前一条。
有两个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();
------解决方案--------------------
就是说你假设有三个列
id name time
1
2
3
4
5
如果是字段相同,就直接两张表加上去,不相同但只有TIME类型是相同的,那就dt.Columns.Add("Name", typeof(string));这样添加第二张表的列,然后再加上去,再按我上面的排序一下,就得到了理想的表了。你想合并啊删除什么的随你后面操作。
------解决方案--------------------
时间相减啊.
先把datatable里的数据取出来,转换成datetime类型
然后datetime-datetime=timespan
------解决方案--------------------
[如果是字段相同,就直接两张表加上去,不相同但只有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行的绝对值,看哪个大,记录下来。然后你注意下临界值,不让溢出就可以了。
------解决方案--------------------
[如果是字段相同,就直接两张表加上去,不相同但只有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时则只比较前一条。