前幾天服務端有業務要增加點需求,有一個處理是利用datatable比對出兩個不同的用戶列表,拿着比對的結果再與另外一個datatable進行比較。
最基本的寫法無非是寫多層foreach循環,數據量多了,循環的次數是乘積增長的。
這里推薦使用Except()差集、Intersect()交集,具體性能沒有進行對比。
如果兩個datatable的字段完全一致的話,可以直接使用Except,Intersect
//與免打擾中的用戶進行比較,篩選出可以正常接收推送的用戶 var normalReceive = dtUser.AsEnumerable().Except(dtDND.AsEnumerable(), DataRowComparer.Default); //比對兩個表的用戶名一致的,保存username到list中 var intersectUser = dtUserPower.AsEnumerable().Intersect(normalReceive, DataRowComparer.Default);
foreach (var item in intersectUser)
{
listTemp.Add(item["username"].ToString());
}
如果兩個datatable中有部分字段相同,也就是說有可進行比對的字段的話。
//與免打擾中的用戶進行比較,篩選出可以正常接收推送的用戶 var normalReceive = from r in dtUser.AsEnumerable() where !(from rr in dtDND.AsEnumerable() select rr.Field<string>("username")).Contains( r.Field<string>("username")) select r; //比對兩個表的用戶名一致的,保存token到list中 var intersectUser = from r in normalReceive.AsEnumerable() where (from rr in dtUserPower.AsEnumerable() select rr.Field<string>("username")).Contains( r.Field<string>("username")) select r; foreach (var item in intersectUser) { listTemp.Add(item["token"].ToString()); }
