更快速地比较两个不同对象的列表

时间:2017-05-26 10:02:12

标签: c# list comparison

我比较两个列表,看一个是否包含另一个列的值,反之亦然:

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();

这似乎工作得很好但是每个对象中有超过100,000个对象变得有点慢。有没有人知道是否有更有效的方法进行比较并返回相应的列表?

2 个答案:

答案 0 :(得分: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 :(得分:-1)

这个问题进入了集理论的数学领域: https://en.wikipedia.org/wiki/Set_theory 具体来说,一个交叉点: https://en.wikipedia.org/wiki/Intersection_(set_theory)

除了找到那些维基百科Artikels之外,我不知道这是不幸的。

您可以通过制作检查缓动器来计算速度。但是看起来你在整数上是匹配的(customerNumber听起来像一个整数候选者)。