首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

datatable 求交集,该如何处理

2012-03-11 
datatable 求交集两个同样结构的表,其中部分数据行相同,如何求交集呢?只能一条一条取出来比对么?比如用sel

datatable 求交集
两个同样结构的表,其中部分数据行相同,如何求交集呢?
只能一条一条取出来比对么?比如用select 其中的一行的某个字段值等于另一个表的某行的同字段值的话,
把这一行选出来。

[解决办法]
嘿嘿,想到一个邪恶的方法,利用
try{}catch{}

把一个表里的行向另一个表里插,插不进的就是交集数据,
在catch里面写到交集表里面。
[解决办法]
你可以先把一个表的数据全部插入到另个表里面 然后在另一个表根据分组大于1的就是他们两个表的交集了哦
 
[解决办法]
参考这个
http://weblogs.sqlteam.com/davidm/archive/2004/01/21/753.aspx

目前想不到更好的
[解决办法]
我的思路是先把那张源数据库合到dsTempValue这个表里,然后新建个空表.在源数据库表里做每行每列循环,把每行每列的值合并成一个字符串加到List里,然后在空表里添加行的时候判断list里是否有相同数据,如果有则不添加.这样就不会有重复数据了

C# code
DataTable dtTarget = new DataTable();List<string> lsKeys = new List<string>();foreach (DataRow row in dsTempValue.Tables[1].Rows)//循环每行                     {                         drTarget = dtTarget.NewRow();                         string key = "";                         foreach (DataColumn col in dsTempValue.Tables[1].Columns)//循环每列                         {                                                              key += row[col.ColumnName].ToString();                                 drTarget[col.ColumnName] = row[col.ColumnName];                                                   }                         if (!lsKeys.Contains(key))//判断是否已经有相同数据                            {                             dtTarget.Rows.Add(drTarget);                         }                         lsKeys.Add(key);                     }
[解决办法]

写SQL语句啊

select a.*,b.* from TableA left join TableB on a.相同的字段=b.相同的字段

就可以实现你要的效果了,你试试!

参考
[解决办法]
说实话,不管你在两次循环里面作什么,都效率不高。
楼主想要的就是一个时间复杂度更低的方法吧。

探讨
嘿嘿,想到一个邪恶的方法,利用
try{}catch{}

把一个表里的行向另一个表里插,插不进的就是交集数据,
在catch里面写到交集表里面。

[解决办法]
用LINQ搞定
dataTable.AsEnumerable().Intersect(dataTable2.AsEnumerable(), DataRowComparer.Default)
C# code
using System;using System.Data;using System.Linq;namespace ConsoleApplication1{    internal class Program    {        private static void Main()        {            var dataTable = new DataTable();            dataTable.Columns.Add("A");            dataTable.Columns.Add("B");            dataTable.Columns.Add("C");            dataTable.Rows.Add("1", "2", "3");            dataTable.Rows.Add("1", "2", "4");            dataTable.Rows.Add("2", "2", "3");            dataTable.Rows.Add("5", "2", "1");            dataTable.AcceptChanges();            var dataTable2 = new DataTable();            dataTable2.Columns.Add("A");            dataTable2.Columns.Add("B");            dataTable2.Columns.Add("C");            dataTable2.Rows.Add("1", "2", "3");            dataTable2.Rows.Add("1", "2", "4");            dataTable2.Rows.Add("2", "2", "3");            dataTable2.Rows.Add("5", "2", "1");            dataTable2.AcceptChanges();            Console.WriteLine("A\tB\tC");            foreach (                DataRow dataRow in                    dataTable.AsEnumerable().Intersect(dataTable2.AsEnumerable(), DataRowComparer.Default))            {                Console.WriteLine(dataRow[0] + "\t" + dataRow[1] + "\t" + dataRow[2]);            }            Console.ReadLine();        }    }} 

热点排行