【发布时间】:2013-02-21 12:46:25
【问题描述】:
我有这两个数据表,我想了解它们之间的区别。这是一个例子:
Table1
-------------------------
ID | Name
--------------------------
1 | A
2 | B
3 | C
--------------------------
Table2
-------------------------
ID | Name
--------------------------
1 | A
2 | B
--------------------------
我只想将结果作为 table1 中的数据而不是 table2 (table1-table2) 中的数据
ResultTable
-------------------------
ID | Name
--------------------------
3 | C
--------------------------
我尝试通过 Linq 使用这两个类似的解决方案,但它总是返回 table1 而不是 table1-table2。这是第一个解决方案:
DataTable table1= ds.Tables["table1"];
DataTable table2= ds.Tables["table2"];
var diff= table1.AsEnumerable().Except(table2.AsEnumerable(),DataRowComparer.Default);
第二种解决方案:
var dtOne = table1.AsEnumerable();
var dtTwo = table2.AsEnumerable();
var difference = dtOne.Except(dtTwo);
那么,错误在哪里?非常感谢您的所有回答。 :)
【问题讨论】:
-
除了检查它们是否是同一个实例。它们各自的属性是否相同。您可以使用接受 EqualityComparer 的重载,也可以研究在各种 LINQ+ 库中实现的扩展方法 exceptBy(),也在 Jon Skeets MoreLinq (code.google.com/p/morelinq) 中实现
-
@Tormod,但是在他的第一个解决方案中
DataRowComparer的用途是什么?它会覆盖public bool Equals(TRow leftRow, TRow rightRow)来比较实际的列值。 -
您能展示一下您是如何检索数据表的吗?数据是否可能与您预期的不同?我在 LINQPad 中做了一个快速示例,您的第一个解决方案似乎工作正常。
-
@Tormod,msdn 库另有说明:DataRowComparer
类用于比较 DataRow 对象的值,不比较对象引用。 (msdn.microsoft.com/en-us/library/…)