需求:從兩個不同曆史版本的資料庫提取出相同的表資料(多個表)進行差異對比。
實施:使用集合的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(求并集)等。
後期:這個擴充内部大概還是用循環寫的吧,以後有時間要看看源碼