想请教大家,能够实现“怎样取出两个DateTable中的不重复行”比较好的算法,因为数据量比较大。谢谢!

解决方案 »

  1.   

    得到一个重复算法GetKey 返回一个唯一Key
    引入一个Dictionary<Key,DataRow> newData列表
    DataTable1 记录数 Count1 DataTable2 记录数 Count2Count=Count1>Count2?Count1:Count2;for(int i=0;i<Count;i++){
       取得DataTable1的行 DataRow1
       取得DataTable1的行 DataRow2
       调用 GetKey 得到两行记录的Key,分别为Key1,Key2
       if(!newData.ContainsKey(Key1)) newData.Add(Key1,DataRow1)
       if(!newData.ContainsKey(Key2)) newData.Add(Key2,DataRow2)
    }Dictionary 的 ContainsKey 性能比较好,具说近似为O(1)
    空间换时间。我忽悠的,你可以试试.
      
      

  2.   

    思路: LinQ中Union合并查询:连接不同的集合,自动过滤相同项;延迟。即是将两个集合进行合并操作,过滤相同的项
    var table1 = dt1.AsEnumerable();
    var table2 = dt2.AsEnumerable(); var query = (from p in table1 
                select p).Union(from q in table2
                select q)
      

  3.   

    两个datatable结构一样吗?一样就可以用linq var table1 = dt1.AsEnumerable();
                        var table2 = dt2.AsEnumerable();                    var query = table1.Union(table2).ToArray<DataRow>();
      

  4.   

    如果结构相同,追求性能,感觉手写会更好些。
    使用foreach循环table1,然后判断table2是否存在,不存在则add
      

  5.   

    结构相同的话 也可以先合并 然后在通过Linq筛选出Distinct()
      

  6.   


    已经搞好了,再测试  用的是HashSet (因为我用的是vs2005开发,要添加进去一个引用System.core.dll)还是谢谢大家!
    HashSet<string> OldNumbers = new HashSet<string>();
                HashSet<string> NewNumbers = new HashSet<string>();
                if (tempDt2.Rows.Count > 0)
                {
                    for (int k = 0; k < tempDt2.Rows.Count; k++)
                    {
                        string strOldTel = tempDt2.Rows[k][0].ToString().Substring(0, 11);
                        OldNumbers.Add(strOldTel);
                    }
                }            if (mydt.Rows.Count > 0)
                {
                    for (int k = 0; k < mydt.Rows.Count; k++)
                    {
                        string strNewTel = mydt.Rows[k][0].ToString().Substring(0, 11);
                        NewNumbers.Add(strNewTel);
                    }
                }
                NewNumbers.ExceptWith(OldNumbers);最后把数据从NewNumbers中取出来就行了,比如可以放到DataTable中