思路: LinQ中Union合并查询:连接不同的集合,自动过滤相同项;延迟。即是将两个集合进行合并操作,过滤相同的项 var table1 = dt1.AsEnumerable(); var table2 = dt2.AsEnumerable(); var query = (from p in table1 select p).Union(from q in table2 select q)
两个datatable结构一样吗?一样就可以用linq var table1 = dt1.AsEnumerable(); var table2 = dt2.AsEnumerable(); var query = table1.Union(table2).ToArray<DataRow>();
引入一个Dictionary<Key,DataRow> newData列表
DataTable1 记录数 Count1 DataTable2 记录数 Count2Count=Count1>Count2?Count1:Count2;for(int i=0;i<Count;i++){
取得DataTable1的行 DataRow1
取得DataTable1的行 DataRow2
调用 GetKey 得到两行记录的Key,分别为Key1,Key2
if(!newData.ContainsKey(Key1)) newData.Add(Key1,DataRow1)
if(!newData.ContainsKey(Key2)) newData.Add(Key2,DataRow2)
}Dictionary 的 ContainsKey 性能比较好,具说近似为O(1)
空间换时间。我忽悠的,你可以试试.
var table1 = dt1.AsEnumerable();
var table2 = dt2.AsEnumerable(); var query = (from p in table1
select p).Union(from q in table2
select q)
var table2 = dt2.AsEnumerable(); var query = table1.Union(table2).ToArray<DataRow>();
使用foreach循环table1,然后判断table2是否存在,不存在则add
已经搞好了,再测试 用的是HashSet (因为我用的是vs2005开发,要添加进去一个引用System.core.dll)还是谢谢大家!
HashSet<string> OldNumbers = new HashSet<string>();
HashSet<string> NewNumbers = new HashSet<string>();
if (tempDt2.Rows.Count > 0)
{
for (int k = 0; k < tempDt2.Rows.Count; k++)
{
string strOldTel = tempDt2.Rows[k][0].ToString().Substring(0, 11);
OldNumbers.Add(strOldTel);
}
} if (mydt.Rows.Count > 0)
{
for (int k = 0; k < mydt.Rows.Count; k++)
{
string strNewTel = mydt.Rows[k][0].ToString().Substring(0, 11);
NewNumbers.Add(strNewTel);
}
}
NewNumbers.ExceptWith(OldNumbers);最后把数据从NewNumbers中取出来就行了,比如可以放到DataTable中