首页 新闻 会员 周边 捐助

求指导两组数据比对算法

0
悬赏园豆:50 [已解决问题] 解决于 2012-10-03 17:07

有一组数据是数据库中读取的,存在DataTable中,结构是id,yskinds,bzr,另一组数据是当前设定数据,用IList<KeyValuePair<string, string>>来存的,对应关系yskinds<=>kvp.key,bzr<=>kvp.value,现在要对两组数据进行比对,将结果分别存入IList<KeyValuePair<string, string>> NewRows//新增的数据,值为kvp

IList<KeyValuePair<string, string>> UpdateRows//修改的数据,值为id,kvp.value

IList<string> DeleteRows = new List<string>()//删除的数据,值为id

规则是:DataTable中yskinds没有,而kvp.key有,为新增;DataTable中yskinds==kvp.key && bzr!=kvp.value的,为修改;DataTable中yskinds有,而kvp.key没有的,为删除;

测试数据如下: 

 //建立原始数据
            DataTable dt = new DataTable();
            dt.Columns.Add("id"); dt.Columns.Add("yskinds"); dt.Columns.Add("bzr");
            DataRow dr = dt.NewRow(); dr["id"] = "1"; dr["yskinds"] = "1"; dr["bzr"] = "5"; dt.Rows.Add(dr);
            dr = dt.NewRow(); dr["id"] = "2"; dr["yskinds"] = "5"; dr["bzr"] = "3"; dt.Rows.Add(dr);
            dr = dt.NewRow(); dr["id"] = "3"; dr["yskinds"] = "6"; dr["bzr"] = "10"; dt.Rows.Add(dr);
            dr = dt.NewRow(); dr["id"] = "4"; dr["yskinds"] = "8"; dr["bzr"] = "10"; dt.Rows.Add(dr);
            //建立新的设定数据
              IList<KeyValuePair<string, string>> NewDataRow = new List<KeyValuePair<string, string>>();
            NewDataRow.Add(new KeyValuePair<string, string>("2", "10"));//new
            NewDataRow.Add(new KeyValuePair<string, string>("6", "10"));//nochange
            NewDataRow.Add(new KeyValuePair<string, string>("1", "3"));//update
            NewDataRow.Add(new KeyValuePair<string, string>("8", "30"));//update
            NewDataRow.Add(new KeyValuePair<string, string>("5", "3"));//nochange
            //结果:新增1行,修改2行,删除1行,不变2行
happydaily的主页 happydaily | 菜鸟二级 | 园豆:260
提问于:2012-09-21 16:28
< >
分享
最佳答案
0
                var dicDT = dt.AsEnumerable().ToDictionary(k => k.Field<string>("yskinds"), v => v.Field<string>("bzr")).ToList();
                //删除
                var delete = dicDT.Where(w => NewDataRow.All(a => a.Key != w.Key));
                //新增
                var insert = NewDataRow.Where(w => dicDT.All(a => a.Key != w.Key));
                //不变
                var nochange = dicDT.Intersect(NewDataRow);
                //修改
                var update = NewDataRow.Where(w => dicDT.Any(a => a.Key == w.Key && a.Value != w.Value));
收获园豆:50
Qlin | 老鸟四级 |园豆:2403 | 2012-09-21 17:21

LINQ是挺优雅的,删除的结果怎么是0,另外datatable的ID是要用的,这样转换后就找不到ID了。。

happydaily | 园豆:260 (菜鸟二级) | 2012-09-21 17:41
其他回答(3)
0

可以先把key替换为数字,然后排序,再用二分查找

田林九村 | 园豆:2367 (老鸟四级) | 2012-09-21 16:52

帮我写一个?我写了几次还是有问题

支持(0) 反对(0) happydaily | 园豆:260 (菜鸟二级) | 2012-09-21 17:07
0

C#做就慢了。

开始在数据库的时候可以这样干:

假设两个结果一个是A一个是B, A是新数据, B是旧数据

 

那么做一次A except B

就得到一个差。这个是新增的。

 

再做一次B except A, 得到一个差

这个是删除的。

undefined | 园豆:898 (小虾三级) | 2012-09-21 17:00

用户设定的数据,不在数据库中。

支持(0) 反对(0) happydaily | 园豆:260 (菜鸟二级) | 2012-09-21 17:06

@happydaily: 那就用linq做except。

支持(0) 反对(0) undefined | 园豆:898 (小虾三级) | 2012-09-21 17:49
0

这样比较速度肯定快不到那里去!

jason2013 | 园豆:1998 (小虾三级) | 2012-09-21 17:54

不好意思,搞错了,不要多快,能在一个循环体中解决问题最好了。

支持(0) 反对(0) happydaily | 园豆:260 (菜鸟二级) | 2012-09-21 17:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册