我正在使用DataRelation
来比较两个DataTable
并使用此tutorial返回包含两个原始表不共享的行的第三个表。以下是代码。
public static DataTable Difference(DataTable First, DataTable Second)
{
//Create Empty Table
DataTable table = new DataTable("Difference");
//Must use a Dataset to make use of a DataRelation object
using(DataSet ds = new DataSet())
{
//Add tables
ds.Tables.AddRange(new DataTable[]{First.Copy(),Second.Copy()});
//Get Columns for DataRelation
DataColumn[] firstcolumns = new DataColumn[ds.Tables[0].Columns.Count];
for(int i = 0; i < firstcolumns.Length; i++)
{
firstcolumns[i] = ds.Tables[0].Columns[i];
}
DataColumn[] secondcolumns = new DataColumn[ds.Tables[1].Columns.Count];
for(int i = 0; i < secondcolumns.Length; i++)
{
secondcolumns[i] = ds.Tables[1].Columns[i];
}
//Create DataRelation
DataRelation r = new DataRelation(string.Empty,firstcolumns,secondcolumns,false);
ds.Relations.Add(r);
//Create columns for return table
for(int i = 0; i < First.Columns.Count; i++)
{
table.Columns.Add(First.Columns[i].ColumnName, First.Columns[i].DataType);
}
//If First Row not in Second, Add to return table.
table.BeginLoadData();
foreach(DataRow parentrow in ds.Tables[0].Rows)
{
DataRow[] childrows = parentrow.GetChildRows(r);
if(childrows == null || childrows.Length == 0)
table.LoadDataRow(parentrow.ItemArray,true);
}
table.EndLoadData();
}
return table;
}
当我练习这段代码时,令人惊讶的是,它仅适用于少数情况,而其他情况则失败。
有一个案例,我正在比较两个相同的表(但有不同的来源),两者都有:
DataType
只返回一个品牌新表,其实际上具有与两个原始表完全相同的组合!
我可能错过什么?
两个相同的表格(我上面提到的共享功能)是否有可能具有其他不同的属性(用户眼睛看不出来)?< / p>
或者这可能是一个不好的方法?有哪些可能的选择?
EDITED
System.String
,System.Int32
,System.DateTime
DataSet
Visualizer)
答案 0 :(得分:1)
我必须写一次类似的东西,这是我使用的方法:
首先,只有在每个表中没有重复的行时,此方法才有效。
使用主键..
First.PrimaryKey = firstcolumns;
Second.PrimaryKey = secondcolumns; //These throw exceptions when you have duplicate rows
然后..
foreach (DataRow dr in Second.Rows)
{
List<Object> l = new List<Object>();
foreach (DataColumn dc in secondcolumns) l.Add(dr[dc]);
if (First.Rows.Find(l.ToArray()) == null) //NOT FOUND
{
table.Rows.Add(l.ToArray());
}
}
foreach (DataRow dr in First.Rows)
{
List<Object> l = new List<Object>();
foreach (DataColumn dc in firstcolumns) l.Add(dr[dc]);
if (Second.Rows.Find(l.ToArray()) == null) //NOT FOUND
{
table.Rows.Add(l.ToArray());
}
}
干杯,