Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个相同数据表中每一行的更改值C#_C# - Fatal编程技术网

比较两个相同数据表中每一行的更改值C#

比较两个相同数据表中每一行的更改值C#,c#,C#,我需要比较两个具有相同模式的数据表,并将差异移动到另一个数据表中。下面是我的代码,它工作不正常: DataTable dt1 = new DataTable("TableChanged"); dt1.Columns.Add("StateID",typeof(int)); dt1.Columns.Add("StateInitial"); dt1.Columns.Add("IsActive"); dt1.Rows.Add(new object[] { 10, "GA", 1 }); dt1.Row

我需要比较两个具有相同模式的数据表,并将差异移动到另一个数据表中。下面是我的代码,它工作不正常:

DataTable dt1 = new DataTable("TableChanged");
dt1.Columns.Add("StateID",typeof(int));
dt1.Columns.Add("StateInitial");
dt1.Columns.Add("IsActive");

dt1.Rows.Add(new object[] { 10, "GA", 1 });
dt1.Rows.Add(new object[] { 11, "HI", 0 });
dt1.Rows.Add(new object[] { 12, "ID", 1 });
dt1.Rows.Add(new object[] { 13, "IL", 1 });
dt1.Rows.Add(new object[] { 14, "IN", 0 });
dt1.Rows.Add(new object[] { 15, "IA", 1 });
dt1.Rows.Add(new object[] { 23, "MN", 0 });

DataTable dt2 = new DataTable("TableOriginal");
dt2.Columns.Add("StateID", typeof(int));
dt2.Columns.Add("StateInitial");
dt2.Columns.Add("IsActive");

dt2.Rows.Add(new object[] { 10, "GA", 1 });
dt2.Rows.Add(new object[] { 11, "HI", 1 });
dt2.Rows.Add(new object[] { 12, "ID", 1 });
dt2.Rows.Add(new object[] { 13, "IL", 0 });
dt2.Rows.Add(new object[] { 14, "IN", 1 });
dt2.Rows.Add(new object[] { 15, "IA", 1 });
dt2.Rows.Add(new object[] { 23, "MN", 1 });
var matched = from table1 in dt1.AsEnumerable()
              join table2 in dt2.AsEnumerable() on table1.Field<int>("StateID") equals table2.Field<int>("StateID")
              //where table1.Field<object>("IsActive") == "0"
              where table1.Field<string>("StateInitial") == table2.Field<string>("StateInitial") || table1.Field<object>("IsActive") == table2.Field<object>("IsActive") 
              select table1;
var missing = from table1 in dt1.AsEnumerable()
              where !matched.Contains(table1)
              select table1;

您可以使用
DataRowComparer.Default
,它比较
DataRow
中的每个字段,用于LINQ方法
Intersect
除了
。后者为您提供缺少的行,即所需的结果:

DataRowComparer<DataRow> fieldComparer = DataRowComparer.Default;
IEnumerable<DataRow> matched = dt1.AsEnumerable().Intersect(dt2.AsEnumerable(), fieldComparer);
IEnumerable<DataRow> missing = dt1.AsEnumerable().Except(dt2.AsEnumerable(), fieldComparer);
但我建议使用另一种方式,因为如果没有缺失行,则会引发异常:

DataTable result = dt1.Clone(); // empty, same schema
foreach(DataRow row in missing)
    result.ImportRow(row);

我认为您想将
where
子句中的
|
更改为
&&
它工作得非常好,但是如何将这些缺少的行插入到新的数据表中,您能更新吗?
DataTable result = missing.CopyToDataTable();
DataTable result = dt1.Clone(); // empty, same schema
foreach(DataRow row in missing)
    result.ImportRow(row);