两个集合求差

 需求:从两个不同历史版本的数据库提取出相同的表数据(多个表)进行差异对比。

 实施:使用集合的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(求并集)等。

 后期:这个扩展内部大概还是用循环写的吧,以后有时间要看看源码
 

原文地址:https://www.cnblogs.com/lanshanke/p/5014564.html