当前位置:编程学习 > C#/ASP.NET >>

按条件合并Datatable

有两个结构相同的datatable
分别为dtA,dtB
把dtA的数据添加到dtB里,如果dtB里有dtA相同的数据就不用重复添加
dtA可能自己内部也有重复的数据,但只要dtB没有就都要添加到dtB里
可能说的不太清楚,例

dtA:
1  a
2  b
3  c
3  c
3  b
5  a


dtB
1  a
1  b
2  b
5  a
6  c

合并后
dtC
1  a
1  b
2  b
3  c
3  c
3  b
5  a
6  c

本人C#刚学对dt不是很熟练
希望高手指点,,谢谢 --------------------编程问答--------------------

void Main()
{
DataTable dtA=new DataTable();
dtA.Columns.Add("id",typeof(int));
dtA.Columns.Add("name",typeof(string));
dtA.Rows.Add(1,"a");
dtA.Rows.Add(2,"b");
dtA.Rows.Add(3,"c");
dtA.Rows.Add(3,"c");
dtA.Rows.Add(3,"b");
dtA.Rows.Add(5,"a");
DataTable dtB=dtA.Clone();
dtB.Rows.Add(1,"a");
dtB.Rows.Add(1,"b");
dtB.Rows.Add(2,"b");
dtB.Rows.Add(5,"a");
dtB.Rows.Add(6,"c");
 
var query=from a in dtA.AsEnumerable()
          let list=dtA.AsEnumerable().Except(dtB.AsEnumerable(),DataRowComparer.Default)
 from l in list
 where a.Field<int>("id")==l.Field<int>("id")
        && a.Field<string>("name")==l.Field<string>("name")
 select a;
 query=dtB.AsEnumerable().Concat(query).OrderBy(o=>o.Field<int>("id"));
 
 DataTable dtC=dtA.Clone();
 query.ToList().ForEach(q=>dtC.Rows.Add(q.ItemArray));
 Console.WriteLine("id\tname\t");
 dtC.AsEnumerable().ToList().ForEach(c=>Console.WriteLine(string.Format("{0}\t{1}\t",c.ItemArray[0],c.ItemArray[1])));
 
/*
id name
1 a
1 b
2 b
3 c
3 c
3 b
5 a
6 c
*/
 
          
}









论坛签名======================================================================

vl525lv:你好!
截至 2011-03-15 14:12:01 前:
你已发帖 27 个, 未结贴 0 个;
结贴率为: 100.00%

当您的问题得到解答后请及时结贴.
http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html

如何给分和结贴?
http://community.csdn.net/Help/HelpCenter.htm#结帖

如何给自己的回帖中也加上签名?
http://blog.csdn.net/q107770540/archive/2011/03/15/6250007.aspx --------------------编程问答--------------------
引用 1 楼 q107770540 的回复:
C# code

void Main()
{
    DataTable dtA=new DataTable();
    dtA.Columns.Add("id",typeof(int));
    dtA.Columns.Add("name",typeof(string));
    dtA.Rows.Add(1,"a");
    dtA.Rows.Add(2,"b");
……



这是什么代码啊?  不是C#啊? --------------------编程问答-------------------- 是C#
linq to datatable --------------------编程问答--------------------
引用 3 楼 q107770540 的回复:
是C#
linq to datatable


看不懂。。。var不是js的数据类型吗
不懂啊不懂 --------------------编程问答-------------------- Tim  威武。 --------------------编程问答-------------------- 如果是NET2.0,LINQ还不能用..

自己循环判断插入./

foreach(datarow drow in dtA)
{
  string expression = "id="+drow["id"].tostring()+" AND name="+drow["id"].tostring();

   DataRow[] foundRows;

  // Use the Select method to find all rows matching the filter.
  foundRows = dtB.Select(expression);

  if(!(foundRows.Length>0))//未找到相同记录
     dtb.ImportRow(drow);
} --------------------编程问答-------------------- linq整合了这么多语法,效率上不知道如何! --------------------编程问答-------------------- 6#代码手写的...LZ自己看下思路啊... --------------------编程问答-------------------- dtB.Merge(dtA) --------------------编程问答--------------------

仔细分析后发现dtA内有两条重复的数据 3 c 都要添加到 dtB内,这点要注意 

实现思路: 

l   先找出要添加到 dtB内的数据 即:存在于dtA却不存在于dtB内的DataRow:({3 c} {3 c} {3 b} 

l   将找到的数据与dtB中记录合并并排序 

l   添加到dtC中 

 //第一步 先初始化数据 



                DataTable dtA = new DataTable(); 



                dtA.Columns.Add("id", typeof(int)); 



                dtA.Columns.Add("name", typeof(string)); 



                dtA.Rows.Add(1, "a"); 



                dtA.Rows.Add(2, "b"); 



                dtA.Rows.Add(3, "c"); 



                dtA.Rows.Add(3, "c"); 



                dtA.Rows.Add(3, "b"); 



                dtA.Rows.Add(5, "a"); 



                DataTable dtB = dtA.Clone(); 



                dtB.Rows.Add(1, "a"); 



                dtB.Rows.Add(1, "b"); 



                dtB.Rows.Add(2, "b"); 



                dtB.Rows.Add(5, "a"); 



                dtB.Rows.Add(6, "c");





//第二步:找出要添加到 dtB内的数据即:存在于dtA却不存在于dtB内的DataRow:({3 c} {3 c} {3 b} 



 var query = dtA.AsEnumerable().Except(dtB.AsEnumerable(), DataRowComparer.Default); 



//我们先来看看query内的结果是什么: 



 query.ToList().ForEach(c => Console.WriteLine(string.Format("{0}\t{1}\t", c.ItemArray[0], c.ItemArray[1]))); 



                /* 



                3  c    



                3  b 



                */ 




 


将结果打印出来后,我们发现结果中只有两行,少了一行 3 c,于是我们要这样来得到我们想要的结果: 



   var query = from a in dtA.AsEnumerable() 
                   where dtB.AsEnumerable().Where(b=>a.Field<int>("id")==b.Field<int>("id") 
                    && a.Field<string>("name")==b.Field<string>("name")).Count()==0 
                     select a;        



    //我们再来看看query内的结果是什么:此时就是我们想要的结果了 



   query.ToList().ForEach(c => Console.WriteLine(string.Format("{0}\t{1}\t", c.ItemArray[0], c.ItemArray[1]))); 



                /* 



               3   c    



               3   c    



               3   b 



                */ 




 


接下来就是最后一步合并query 和dbB,得到最终想要的dtC,完整代码如下: 




 


void Main() 







      DataTable dtA=new DataTable(); 



     dtA.Columns.Add("id",typeof(int)); 



     dtA.Columns.Add("name",typeof(string)); 



     dtA.Rows.Add(1,"a"); 



     dtA.Rows.Add(2,"b"); 



     dtA.Rows.Add(3,"c"); 



     dtA.Rows.Add(3,"c"); 



     dtA.Rows.Add(3,"b"); 



     dtA.Rows.Add(5,"a"); 



     



     DataTable dtB=dtA.Clone(); 



     dtB.Rows.Add(1,"a"); 



     dtB.Rows.Add(1,"b"); 



     dtB.Rows.Add(2,"b"); 



     dtB.Rows.Add(5,"a"); 



     dtB.Rows.Add(6,"c"); 



     



     var query=(from a in dtA.AsEnumerable() 
                  where dtB.AsEnumerable().Where(b=>a.Field<int>("id")==b.Field<int>("id") 
                   && a.Field<string>("name")==b.Field<string>("name")).Count()==0 
                   select a).Concat(dtB.AsEnumerable()).OrderBy(o=>o.Field<int>("id")); 



       



      DataTable dtC=dtA.Clone(); 



      query.ToList().ForEach(q=>dtC.Rows.Add(q.ItemArray)); 



      Console.WriteLine("id\tname\t"); 



      dtC.AsEnumerable().ToList().ForEach(c=>Console.WriteLine(string.Format("{0}\t{1}\t",c.ItemArray[0],c.ItemArray[1]))); 



       



     /* 



     id    name    



     1    a    



     1    b    



     2    b    



     3    c    



     3    c    



     3    b    



     5    a    



     6    c 



     */ 



       



}



本文来自CSDN博客,转载请标明出处:
http://blog.csdn.net/q107770540/archive/2011/03/16/6252339.aspx
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,