我有两个不同类型的对象集合,分别称为类型 ALPHA 和类型 BRAVO 。每种类型都有一个属性作为对象的“ID”。在类中没有重复的ID,因此对于任何给定的ID,最多只有一个 ALPHA 和一个 BRAVO 实例。我需要做的是将它们分成三类:
我知道对于第3种情况,我可以执行以下操作:
- ID出现在 ALPHA 中但未出现在 BRAVO 集合中的实例;
- ID出现在 BRAVO 中但未出现在 ALPHA 集合中的实例;
- ID同时出现在两个集合中的实例。
我知道对于第3种情况,我可以执行以下操作:
var myCorrelatedItems = myAlphaItems.Join(myBravoItems, alpha => alpha.Id, beta => beta.Id, (inner, outer) => new
{
alpha = inner,
beta = outer
});
我还可以编写代码来解决第一种和第二种情况,大致如下:
var myUnmatchedAlphas = myAlphaItems.Where(alpha=>!myBravoItems.Any(bravo=>alpha.Id==bravo.Id));
同样地,对于unMatchedBravos也是如此。不幸的是,这将导致对alphas集合(可能非常大!)进行多次迭代,以及对bravos集合(也可能非常大!)进行多次迭代。
有没有办法统一这些查询概念,以最小化对列表的迭代?这些集合可能有数千个项目。
IEqualityComparer<ABItem>
而不是一个IComparer
。并且,我会用a.Id.CompareTo(b.Id)
代替使用 GetId 方法(因为这个通用比较器将接收 ABItems 而不是 objects)。 - Mariano Desanze