datatable 求交集 两个同样结构的表,其中部分数据行相同,如何求交集呢?只能一条一条取出来比对么?比如用select 其中的一行的某个字段值等于另一个表的某行的同字段值的话,把这一行选出来。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在sql里面控制,然后fill 到DataSet,DataTable 嘿嘿,想到一个邪恶的方法,利用try{}catch{}把一个表里的行向另一个表里插,插不进的就是交集数据,在catch里面写到交集表里面。 楼主的思路也不错啊用一个for循环,循环一个表如果是sql的话,用if exists判断会快点如果exists就addelse continue这个效率上不会太差吧期待高手给更好的答案 参考这个http://weblogs.sqlteam.com/davidm/archive/2004/01/21/753.aspx目前想不到更好的 不知道是否可行,你可以将数据库中的每条数据看成一个类对象,将两个表的所有对象都添加到两个LIST中,循环遍历对象,看那些对象相等就取出来。 我的思路是先把那张源数据库合到dsTempValue这个表里,然后新建个空表.在源数据库表里做每行每列循环,把每行每列的值合并成一个字符串加到List里,然后在空表里添加行的时候判断list里是否有相同数据,如果有则不添加.这样就不会有重复数据了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.相同的字段就可以实现你要的效果了,你试试!参考 说实话,不管你在两次循环里面作什么,都效率不高。楼主想要的就是一个时间复杂度更低的方法吧。如果楼主的DataTable是个有主键的DataTable,可以尝试一下这个。foreach (DataRow dr in data1.Rows) { try { data2.ImportRow(dr); } catch { data3.ImportRow(dr); }} 用LINQ搞定dataTable.AsEnumerable().Intersect(dataTable2.AsEnumerable(), DataRowComparer.Default)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(); } }} //首先要添加System.Data.DataSetExtensions;DataSet ds = new DataSet();ds.Locale = CultureInfo.InvariantCulture;FillDataSet(ds);DataTable contactTable = ds.Tables["Contact"];// Create two tables.IEnumerable<DataRow> query1 = from contact in contactTable.AsEnumerable() where contact.Field<string>("Title") == "Ms." select contact;IEnumerable<DataRow> query2 = from contact in contactTable.AsEnumerable() where contact.Field<string>("FirstName") == "Sandra" select contact;DataTable contacts1 = query1.CopyToDataTable();DataTable contacts2 = query2.CopyToDataTable();// Find the intersection of the two tables. 求交集用 Intersect/Union(并集)/Except(差集)var contacts = contacts1.AsEnumerable().Intersect(contacts2.AsEnumerable(), DataRowComparer.Default);Console.WriteLine("Intersection of contacts tables");foreach (DataRow row in contacts){ Console.WriteLine("Id: {0} {1} {2} {3}", row["ContactID"], row["Title"], row["FirstName"], row["LastName"]);}DbHelperSQL.connectionString = strSiteConnection;DataTable dtblSiteTable = DbHelperSQL.TQuery("Select * From " + strTableName);IEnumerable<DataRow> querySite = from contact in dtblSiteTable.AsEnumerable() select contact;DbHelperSQL.connectionString = strMainConnection;DataTable dtblMainTable = DbHelperSQL.TQuery("Select * From " + strTableName);IEnumerable<DataRow> queryMain = from contact in dtblMainTable.AsEnumerable() select contact;var EnumerableExcept = querySite.CopyToDataTable().AsEnumerable().Except(queryMain.CopyToDataTable().AsEnumerable(), DataRowComparer.Default); DataTable dtblExcept = EnumerableExcept.CopyToDataTable(); //dtblExcept 即为差异的数据表摘抄自:http://www.cnblogs.com/zhangpengshou/archive/2010/06/30/1768384.html crystal Report 传参数。。。 C#网络编程Socket中线程同步如何实现? 这句那错了? 如何远程修改文件属性 如何理解这句((Button)sender).Text = "mybutton" 请问C#里如何用堆栈实现对表达式求值的问题 TcpClient怎样指定客户端的端口和服务端相连接 这样行吗? vs2010 installer 如何添加卸载程序 兄弟们。高手们。让我们共同创业。 输入中文的时候..错误提示 列名小龙无效 怎么把“高清”转换成“\u6807\u6e05”
try{}catch{}把一个表里的行向另一个表里插,插不进的就是交集数据,
在catch里面写到交集表里面。
楼主的思路也不错啊
用一个for循环,循环一个表
如果是sql的话,用if exists判断会快点
如果exists就add
else continue
这个效率上不会太差吧期待高手给更好的答案
http://weblogs.sqlteam.com/davidm/archive/2004/01/21/753.aspx目前想不到更好的
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.相同的字段就可以实现你要的效果了,你试试!参考
楼主想要的就是一个时间复杂度更低的方法吧。
如果楼主的DataTable是个有主键的DataTable,可以尝试一下这个。foreach (DataRow dr in data1.Rows) {
try {
data2.ImportRow(dr);
} catch {
data3.ImportRow(dr);
}
}
dataTable.AsEnumerable().Intersect(dataTable2.AsEnumerable(), DataRowComparer.Default)
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();
}
}
}
DataSet ds = new DataSet();
ds.Locale = CultureInfo.InvariantCulture;
FillDataSet(ds);DataTable contactTable = ds.Tables["Contact"];// Create two tables.
IEnumerable<DataRow> query1 = from contact in contactTable.AsEnumerable()
where contact.Field<string>("Title") == "Ms."
select contact;IEnumerable<DataRow> query2 = from contact in contactTable.AsEnumerable()
where contact.Field<string>("FirstName") == "Sandra"
select contact;
DataTable contacts1 = query1.CopyToDataTable();
DataTable contacts2 = query2.CopyToDataTable();// Find the intersection of the two tables. 求交集用 Intersect/Union(并集)/Except(差集)
var contacts = contacts1.AsEnumerable().Intersect(contacts2.AsEnumerable(),
DataRowComparer.Default);Console.WriteLine("Intersection of contacts tables");
foreach (DataRow row in contacts)
{
Console.WriteLine("Id: {0} {1} {2} {3}",
row["ContactID"], row["Title"], row["FirstName"], row["LastName"]);
}
DbHelperSQL.connectionString = strSiteConnection;
DataTable dtblSiteTable = DbHelperSQL.TQuery("Select * From " + strTableName);
IEnumerable<DataRow> querySite = from contact in dtblSiteTable.AsEnumerable() select contact;DbHelperSQL.connectionString = strMainConnection;
DataTable dtblMainTable = DbHelperSQL.TQuery("Select * From " + strTableName);
IEnumerable<DataRow> queryMain = from contact in dtblMainTable.AsEnumerable() select contact;var EnumerableExcept = querySite.CopyToDataTable().AsEnumerable().Except(queryMain.CopyToDataTable().AsEnumerable(), DataRowComparer.Default);
DataTable dtblExcept = EnumerableExcept.CopyToDataTable(); //dtblExcept 即为差异的数据表摘抄自:http://www.cnblogs.com/zhangpengshou/archive/2010/06/30/1768384.html