C# 兩個datatable中的數據快速比較返回交集或差集


前幾天服務端有業務要增加點需求,有一個處理是利用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());
                                }

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM