2个DataTable合并交集的问题。

z22708387 2014-10-30 11:05:48

现有2个DataTable


dt1:

Key A1 A2
1 A AA
2 B BB
3 C CC


dt2:

Key B1 B2 B3
1 TestA TestAA TestAAA
2 TestB TestBB TestBBB
3 TestC TestCC TestCCC
4 TestD TestDD TestDDD



合并后:
Key A1 A2 B1 B2 B3
1 A AA TestA TestAA TestAAA
2 B BB TestB TestBB TestBBB
3 C CC TestC TestCC TestCCC


求大神指教,要求考虑性能方面的问题。
因为2个表也许数据量会很大。
...全文
199 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
1988525 2014-10-30
  • 打赏
  • 举报
回复
引用 3 楼 z22708387 的回复:
[quote=引用 1 楼 u013756007 的回复:] /// <summary> /// 将两个列不同的DataTable合并成一个新的DataTable /// </summary> /// <param name="dt1">Table表1</param> /// <param name="dt2">Table表2</param> /// <param name="DTName">合并后新的表名</param> /// <returns></returns> private DataTable UniteDataTable( DataTable dt1 ,DataTable dt2 ,string DTName) { DataTable dt3 = dt1.Clone(); for( int i = 0 ;i < dt2.Columns.Count ;i ++ ) { dt3.Columns.Add( dt2.Columns[i].ColumnName ) ; } object[] obj = new object[dt3.Columns.Count]; for (int i = 0; i < dt1.Rows.Count; i++) { dt1.Rows[i].ItemArray.CopyTo(obj,0); dt3.Rows.Add(obj); } if( dt1.Rows.Count >= dt2.Rows.Count ) { for( int i = 0 ;i < dt2.Rows.Count ;i++ ) { for( int j = 0 ;j < dt2.Columns.Count ;j ++ ) { dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ; } } } else { DataRow dr3 ; for( int i = 0 ;i < dt2.Rows.Count - dt1.Rows.Count ;i ++ ) { dr3 = dt3.NewRow() ; dt3.Rows.Add( dr3 ) ; } for( int i = 0 ;i < dt2.Rows.Count ;i++ ) { for( int j = 0 ;j < dt2.Columns.Count ;j ++ ) { dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ; } } } dt3.TableName = DTName ; return dt3 ; }
这个没有性能可言,我知道这个方法。 但是我想知道有没有更加好的方法。。[/quote] 更好的方法就得找数据来源了,如果是从数据库查出来的就直接一个sql查出放在dt中,或者就直接用2个dt被,为啥要合并
於黾 2014-10-30
  • 打赏
  • 举报
回复
引用 4 楼 z22708387 的回复:
[quote=引用 2 楼 duanzi_peng 的回复:]

select A.Key,A.A1,A.A2,B.B1,B.B2,B.B3 from dt1  as A
inner join dt2  as B on A.Key = B.Key
这个是什么代码?? [/quote] 这个就是你在数据库里查询的时候直接把它们关联起来 而不是先放到两个datatable里再自己想办法合并
z22708387 2014-10-30
  • 打赏
  • 举报
回复
引用 2 楼 duanzi_peng 的回复:

select A.Key,A.A1,A.A2,B.B1,B.B2,B.B3 from dt1  as A
inner join dt2  as B on A.Key = B.Key
这个是什么代码??
z22708387 2014-10-30
  • 打赏
  • 举报
回复
引用 1 楼 u013756007 的回复:
/// <summary> /// 将两个列不同的DataTable合并成一个新的DataTable /// </summary> /// <param name="dt1">Table表1</param> /// <param name="dt2">Table表2</param> /// <param name="DTName">合并后新的表名</param> /// <returns></returns> private DataTable UniteDataTable( DataTable dt1 ,DataTable dt2 ,string DTName) { DataTable dt3 = dt1.Clone(); for( int i = 0 ;i < dt2.Columns.Count ;i ++ ) { dt3.Columns.Add( dt2.Columns[i].ColumnName ) ; } object[] obj = new object[dt3.Columns.Count]; for (int i = 0; i < dt1.Rows.Count; i++) { dt1.Rows[i].ItemArray.CopyTo(obj,0); dt3.Rows.Add(obj); } if( dt1.Rows.Count >= dt2.Rows.Count ) { for( int i = 0 ;i < dt2.Rows.Count ;i++ ) { for( int j = 0 ;j < dt2.Columns.Count ;j ++ ) { dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ; } } } else { DataRow dr3 ; for( int i = 0 ;i < dt2.Rows.Count - dt1.Rows.Count ;i ++ ) { dr3 = dt3.NewRow() ; dt3.Rows.Add( dr3 ) ; } for( int i = 0 ;i < dt2.Rows.Count ;i++ ) { for( int j = 0 ;j < dt2.Columns.Count ;j ++ ) { dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ; } } } dt3.TableName = DTName ; return dt3 ; }
这个没有性能可言,我知道这个方法。 但是我想知道有没有更加好的方法。。
vendyhzx 2014-10-30
  • 打赏
  • 举报
回复
你内容少的作为主DataTable A,然后将另外一个DT B的列名加过来,接下来就是遍历A了,A的key 在B里select出来的row大于0就把A表里的B列加上,否在在B里不存在就remove掉,这应该是最有的逻辑了吧。只需遍历一较短的。
vendyhzx 2014-10-30
  • 打赏
  • 举报
回复
不用linq不用循环,没法搞啊
exception92 2014-10-30
  • 打赏
  • 举报
回复

select A.Key,A.A1,A.A2,B.B1,B.B2,B.B3 from dt1  as A
inner join dt2  as B on A.Key = B.Key
1988525 2014-10-30
  • 打赏
  • 举报
回复
/// <summary> /// 将两个列不同的DataTable合并成一个新的DataTable /// </summary> /// <param name="dt1">Table表1</param> /// <param name="dt2">Table表2</param> /// <param name="DTName">合并后新的表名</param> /// <returns></returns> private DataTable UniteDataTable( DataTable dt1 ,DataTable dt2 ,string DTName) { DataTable dt3 = dt1.Clone(); for( int i = 0 ;i < dt2.Columns.Count ;i ++ ) { dt3.Columns.Add( dt2.Columns[i].ColumnName ) ; } object[] obj = new object[dt3.Columns.Count]; for (int i = 0; i < dt1.Rows.Count; i++) { dt1.Rows[i].ItemArray.CopyTo(obj,0); dt3.Rows.Add(obj); } if( dt1.Rows.Count >= dt2.Rows.Count ) { for( int i = 0 ;i < dt2.Rows.Count ;i++ ) { for( int j = 0 ;j < dt2.Columns.Count ;j ++ ) { dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ; } } } else { DataRow dr3 ; for( int i = 0 ;i < dt2.Rows.Count - dt1.Rows.Count ;i ++ ) { dr3 = dt3.NewRow() ; dt3.Rows.Add( dr3 ) ; } for( int i = 0 ;i < dt2.Rows.Count ;i++ ) { for( int j = 0 ;j < dt2.Columns.Count ;j ++ ) { dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ; } } } dt3.TableName = DTName ; return dt3 ; }
gucangen 2014-10-30
  • 打赏
  • 举报
回复
select A.Key,A.A1,A.A2,B.B1,B.B2,B.B3 from dt1 as A inner join dt2 as B on A.Key = B.Key 这个靠谱,前提两个表至少得有个键的值一样,如果A.Key = B.Key 不匹配的话,那就full outer join 全连接吧
z22708387 2014-10-30
  • 打赏
  • 举报
回复
LinQ是完成了。。 还有点小问题。。
E次奥 2014-10-30
  • 打赏
  • 举报
回复
3.5不是都有Linq了么,用Linq啊
smthgdin_020 2014-10-30
  • 打赏
  • 举报
回复
考虑性能最好就直接用数据库视图这类的。
於黾 2014-10-30
  • 打赏
  • 举报
回复
那就自己循环判断一下呗 双重循环而已 耗费不了什么性能,顶多就是代码长一点 即使支持LINQ,LINQ底层还是循环,性能上可能LINQ耗内存更高,因为要实例化一大堆类出来
z22708387 2014-10-30
  • 打赏
  • 举报
回复
引用 6 楼 u013756007 的回复:
[quote=引用 3 楼 z22708387 的回复:] [quote=引用 1 楼 u013756007 的回复:] /// <summary> /// 将两个列不同的DataTable合并成一个新的DataTable /// </summary> /// <param name="dt1">Table表1</param> /// <param name="dt2">Table表2</param> /// <param name="DTName">合并后新的表名</param> /// <returns></returns> private DataTable UniteDataTable( DataTable dt1 ,DataTable dt2 ,string DTName) { DataTable dt3 = dt1.Clone(); for( int i = 0 ;i < dt2.Columns.Count ;i ++ ) { dt3.Columns.Add( dt2.Columns[i].ColumnName ) ; } object[] obj = new object[dt3.Columns.Count]; for (int i = 0; i < dt1.Rows.Count; i++) { dt1.Rows[i].ItemArray.CopyTo(obj,0); dt3.Rows.Add(obj); } if( dt1.Rows.Count >= dt2.Rows.Count ) { for( int i = 0 ;i < dt2.Rows.Count ;i++ ) { for( int j = 0 ;j < dt2.Columns.Count ;j ++ ) { dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ; } } } else { DataRow dr3 ; for( int i = 0 ;i < dt2.Rows.Count - dt1.Rows.Count ;i ++ ) { dr3 = dt3.NewRow() ; dt3.Rows.Add( dr3 ) ; } for( int i = 0 ;i < dt2.Rows.Count ;i++ ) { for( int j = 0 ;j < dt2.Columns.Count ;j ++ ) { dt3.Rows[i][j+dt1.Columns.Count] = dt2.Rows[i][j].ToString() ; } } } dt3.TableName = DTName ; return dt3 ; }
这个没有性能可言,我知道这个方法。 但是我想知道有没有更加好的方法。。[/quote] 更好的方法就得找数据来源了,如果是从数据库查出来的就直接一个sql查出放在dt中,或者就直接用2个dt被,为啥要合并[/quote] 因为最后需要把数据绑定在GridView中.
z22708387 2014-10-30
  • 打赏
  • 举报
回复
引用 5 楼 Z65443344 的回复:
[quote=引用 4 楼 z22708387 的回复:] [quote=引用 2 楼 duanzi_peng 的回复:]

select A.Key,A.A1,A.A2,B.B1,B.B2,B.B3 from dt1  as A
inner join dt2  as B on A.Key = B.Key
这个是什么代码?? [/quote] 这个就是你在数据库里查询的时候直接把它们关联起来 而不是先放到两个datatable里再自己想办法合并[/quote] 已经在Datatable中了 2个表格的数据是2个数据库 . 而且用的是3.5 .不支持linq

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧