需求:从两个不同历史版本的数据库提取出相同的表数据(多个表)进行差异对比。
实施:使用集合的Except扩展方法
过程:开始想的是写代码循环比较差异,但是代码写起来比较繁琐,后来发现集合有一个Except扩展方法正是用来实现求差集的。
部分代码如下
EnumerableRowCollection<HtRefInfo> hta; EnumerableRowCollection<HtRefInfo> htb; hta = DalA.LoadHt(ids); htb = DalB.LoadHt(ids); var only_a_has = hta.Except(htb, new HtDiffEquality());//a有,b没有的 //---------------------------------------------------------------------------- HtDiffEquality类里定义了两个集合的比较规则 public class HtDiffEquality : IEqualityComparer<HtRefInfo> { public bool Equals(HtRefInfo x, HtRefInfo y) { return (x.TableName == y.TableName && x.TableID == y.TableID && x.HtID == y.HtID); } public int GetHashCode(HtRefInfo obj) { if (obj == null) { return 0; } else { return obj.ToString().GetHashCode(); } } }
注意:如果两个集合的数据比较多,程序会比较慢。我实际的数据两个集合都有10万条数据,执行了10几分钟(电脑8g内存,I5)
补充:除了except扩展方法,还有Intersect(求交集),Union(求并集)等。
后期:这个扩展内部大概还是用循环写的吧,以后有时间要看看源码