有2个dataset,一个A里面含有8W条数据,一个B含有100条数据,里面数据结构是一致的,key也一样。
现在想合并2个dataset,循环遍历B,根据B中的key去修改A的数据,数据值以B的为最终的,数据量以A的为最终的。
我现在的做法是2个循环的做法,先遍历B,取出key,再遍历A,发现A中的key跟B的一致的话则修改。
public DataSet UpdateData(DataSet OcsDs, DataSet TdDs)
{
DataSet ds = new DataSet();
try
{
for (int i = 0; OcsDs != null && i < OcsDs.Tables[0].Rows.Count; i++)
{
string TRAIN_ID = OcsDs.Tables[0].Rows[i]["TRAIN_ID"].ToString();
string NODE_CODE = OcsDs.Tables[0].Rows[i]["NODE_CODE"].ToString();
for (int j = 0; TdDs != null && j < TdDs.Tables[0].Rows.Count; j++)
{
if (TdDs.Tables[0].Rows[i]["TRAIN_ID"] == TRAIN_ID && TdDs.Tables[0].Rows[i]["NODE_CODE"] == NODE_CODE)
{
//根据OcsDs修改TdDs数据
}
} }
catch (Exception ex)
{
sys.WriteError(ex);
}
return ds;
}这样可能会造出操作时间过长,我想问问各位大大,有没有比较效率的方法,
现在想合并2个dataset,循环遍历B,根据B中的key去修改A的数据,数据值以B的为最终的,数据量以A的为最终的。
我现在的做法是2个循环的做法,先遍历B,取出key,再遍历A,发现A中的key跟B的一致的话则修改。
public DataSet UpdateData(DataSet OcsDs, DataSet TdDs)
{
DataSet ds = new DataSet();
try
{
for (int i = 0; OcsDs != null && i < OcsDs.Tables[0].Rows.Count; i++)
{
string TRAIN_ID = OcsDs.Tables[0].Rows[i]["TRAIN_ID"].ToString();
string NODE_CODE = OcsDs.Tables[0].Rows[i]["NODE_CODE"].ToString();
for (int j = 0; TdDs != null && j < TdDs.Tables[0].Rows.Count; j++)
{
if (TdDs.Tables[0].Rows[i]["TRAIN_ID"] == TRAIN_ID && TdDs.Tables[0].Rows[i]["NODE_CODE"] == NODE_CODE)
{
//根据OcsDs修改TdDs数据
}
} }
catch (Exception ex)
{
sys.WriteError(ex);
}
return ds;
}这样可能会造出操作时间过长,我想问问各位大大,有没有比较效率的方法,
这个不牵扯到sql 的,只在缓存中实现。
DataSet.Merge(DataSet)这是将2个直接DataSet直接合在一起,是直接累加的吧,我要的不是这种效果。
表A
id name age sex
1 aaaa 12 男
2 bbbb 23 男
3 ccccc 33 女
表B
id name age sex
3 GGG 99 女合并之后ds1.Merge(ds2, true);id name age sex
1 aaaa 12 男
2 bbbb 23 男
3 ccccc 33 女
3 GGG 99 女
这个不行的,我要的是
id name age sex
1 aaaa 12 男
2 bbbb 23 男
3 GGG 99 女
你说的是linq to dataset吧,我以前没用过,刚刚我去网上找了一下,var query = (from u in ds1.Tables[0].AsEnumerable()
join r in ds2.Tables[0].AsEnumerable()
on u.Field<int>("id") equals r.Field<int>("id")
select new {
id = u.Field<int>("id"),
name = r.Field<string>("name"),
age = r.Field<int>("age"),
sex = r.Field<string>("sex"),
});
只取到一条数据。
id name age sex
1 aaaa 12 男
2 bbbb 23 男
3 ccccc 33 女
3 GGG 99 女
为什么不在 SQL 中处理好再读到内存呢?SQL 语句处理总比你自己处理要快吧
在o(logn)的时间增删改查。
外循环5W(表1)
内循环100(表2)
如果找到了更新数据,然后删除(表2的该行记录)
然后 100(表2) 去哈希里面找是否存在相同KEY,如果存在更新。否则往哈希里面添加。
这个是目前我想到的最好的办法的了。我也初学 。
不应该使用inner join
而应该使用left join:var query = (from u in ds1.Tables[0].AsEnumerable()
join r in ds2.Tables[0].AsEnumerable()
on u.Field<int>("id") equals r.Field<int>("id") into g
from r in g.DefaultIfEmpty()
select new {
id = u.Field<int>("id"),
name =r==null?u.Field<string>("name"):r.Field<string>("name"),
age =r==null?u.Field<string>("age"): r.Field<int>("age"),
sex = r==null?u.Field<string>("sex"):r.Field<string>("sex"),
});
DataSet ds2 = new DataSet();
Dictionary<int, int> dir = new Dictionary<int, int>();
for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
{//循环八万次
string key = ds.Tables[0].Rows[i]["key"].ToString();
if (!dir.ContainsKey(int.Parse(key)))
dir.Add(int.Parse(key), i);
else
throw new Exception("KEY,非唯一");
}
for (int i = 0; i < ds2.Tables[0].Rows.Count; i++)
{//循环100次
string key = ds2.Tables[0].Rows[i]["key"].ToString();
if (dir.ContainsKey(int.Parse(key)))
{//o(1)的秒杀查找,如果存在
int index = dir[int.Parse(key)];//找到在表一中的下表
DataRow r= ds.Tables[0].Rows[index];//找到该行修改之
}
else
{
//往表1添加
}
}
using System;
using System.Collections.Generic;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace 合并LIST
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
List<person> list = new List<person>();//主数据
list.Add(new person() { id = 1, name = "aaa", sex = "男" });
list.Add(new person() { id = 2, name = "bbb", sex = "女" });
list.Add(new person() { id = 3, name = "ccc", sex = "女" }); List<person> list2 = new List<person>();//修正数据
list2.Add(new person() { id = 2, name = "ggg", sex = "人妖" }); for (int i = 0; i < list2.Count; i++)
{
//找到和修正数据的id相同的删除
list.RemoveAll(obj =>
{ if (obj.id == list2[i].id)
{
return true;
}
else
{
return false;
}
} );
}
list.AddRange(list2);//合并修正数据
DinoComparer dc = new DinoComparer();
list.Sort(dc);//排序
GridView1.DataSource = list;
GridView1.DataBind();
}
} public class person
{
public int id { get; set; }
public string name { get; set; }
public string sex { get; set; }
} public class DinoComparer : IComparer<person>
{
public int Compare(person obj1, person obj2)
{
if (obj1.id < obj2.id)
{
return 1;
}
else
{
return 0;
}
}
}
}显示效果
id name sex
1 aaa 男
2 ggg 人妖
3 ccc 女