2017-05-26 188 views
1

我比較兩個列表,查看是否包含從其他反之亦然值:來比較不同的兩個列表比較快的方式對象

List<customer> NotOnLocal = 
       AllServer.Where(p => !AllLocal.Any(p2 => p2.Reference == p.customerNumber)) 
         .ToList(); 

List<ConnectCustomer> NotOnServer = 
       AllLocal.Where(p => !AllServer.Any(p2 => p2.customerNumber == p.Reference)) 
         .ToList(); 

這似乎很好地工作,但有超過10萬個對象在每個比較中都會慢一點。有誰知道是否有更有效的方法來進行比較並返回相應的列表?

回答

2

您可以使用哈希組(假設你是比較字符串)進行快速檢查,如果某個值是在集(給你O(1)複雜性,而不是O(N)):

var serverCustomerNumbers = new HashSet<string>(AllServer.Select(c => c.customerNumber)); 
var localReferences = new HashSet<string>(AllLocal.Select(c => c.Reference)); 

現在,如果你需要得到整個客戶對象

List<customer> NotOnLocal = 
        AllServer.Where(c => !localReferences.Contains(c.customerNumber)); 

或者您可以使用組操作來獲得所需的客戶數量

var notLocalCustomerNumbers = serverCustomerNumbers.Except(localReferences); 
+1

沒有,可以很好地加快速度(至少爲10倍),謝謝:) –