有一组数据是数据库中读取的,存在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行
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));
LINQ是挺优雅的,删除的结果怎么是0,另外datatable的ID是要用的,这样转换后就找不到ID了。。
可以先把key替换为数字,然后排序,再用二分查找
帮我写一个?我写了几次还是有问题
C#做就慢了。
开始在数据库的时候可以这样干:
假设两个结果一个是A一个是B, A是新数据, B是旧数据
那么做一次A except B
就得到一个差。这个是新增的。
再做一次B except A, 得到一个差
这个是删除的。
用户设定的数据,不在数据库中。
@happydaily: 那就用linq做except。
这样比较速度肯定快不到那里去!
不好意思,搞错了,不要多快,能在一个循环体中解决问题最好了。