按条件合并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 --------------------编程问答--------------------
这是什么代码啊? 不是C#啊? --------------------编程问答-------------------- 是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#