天天看點

兩個集合求差

 需求:從兩個不同曆史版本的資料庫提取出相同的表資料(多個表)進行差異對比。

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

 後期:這個擴充内部大概還是用循環寫的吧,以後有時間要看看源碼