有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;
        }这样可能会造出操作时间过长,我想问问各位大大,有没有比较效率的方法,

解决方案 »

  1.   

    我只用过linq to sql.....求解
      

  2.   

    @Return_false:
    这个不牵扯到sql 的,只在缓存中实现。
      

  3.   

    既然结构相同 我的意思是你可以OcsDs.Tables[0]上连上TdDs.Tables[0] 然后在用linq的Distinct()去除重复
      

  4.   

    @zk11223344,@kspaul:
    DataSet.Merge(DataSet)这是将2个直接DataSet直接合在一起,是直接累加的吧,我要的不是这种效果。
      

  5.   

    我试了一下。
    表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 女
      

  6.   

    ds1.Merge(ds2, false, System.Data.MissingSchemaAction.AddWithKey);
      

  7.   

    @Return_false:
    你说的是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"),
                             });
    只取到一条数据。
      

  8.   

    这个取到的结果还是
    id name age sex
    1 aaaa 12 男
    2 bbbb 23 男
    3 ccccc 33 女
    3 GGG 99 女
      

  9.   

    我觉得在内存怎么也处理不好的.
    为什么不在 SQL 中处理好再读到内存呢?SQL 语句处理总比你自己处理要快吧
      

  10.   

    花o(logn)生成2叉数。
    在o(logn)的时间增删改查。
      

  11.   

    可不可以这样,循环B,对于A则直接DataTable.Select,然后更新,这样不知时间会不会缩短。
      

  12.   

    或者这样因KEY 是唯一的
     外循环5W(表1)
     内循环100(表2)
        如果找到了更新数据,然后删除(表2的该行记录)
      

  13.   

    那你只能把5W(表1)做成一个哈希,
    然后 100(表2) 去哈希里面找是否存在相同KEY,如果存在更新。否则往哈希里面添加。
    这个是目前我想到的最好的办法的了。我也初学 。
      

  14.   

    用DataTable试了一下,好像可以的啊。table2 把table1相同主键的值覆盖了。table1.Merge(table2, false, MissingSchemaAction.AddWithKey);
      

  15.   

    从你的描述来看
    不应该使用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"),
                             });
      

  16.   

     DataSet ds = new DataSet();
                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添加
                    }
                }
      

  17.   

    DataSet不怎么熟,给你个list的,看看是不是效率高点
    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 女