我有两个不同类型的对象集合。让我们称他们为ALPHA和BRAVO。每种类型都有一个属性,即该对象的“ID”。没有ID在类内复制,因此对于任何给定的ID,最多只有一个实例是ALPHA和一个实例。我需要做的就是把它们分为3类:ALPHA不出现BRAVO集合中的ID的LINQ组合查询
- 实例;
- ID中的实例BRAVO哪些没有出现在ALPHA集合中;
- 出现在两个集合中的ID的实例。
在所有3种情况下,我需要从手头收集的实际对象中进行后续操作。
我知道的#3的情况下,我可以这样做:
var myCorrelatedItems = myAlphaItems.Join(myBravoItems, alpha => alpha.Id, beta => beta.Id, (inner, outer) => new
{
alpha = inner,
beta = outer
});
我也可以写代码,#1和#2案件看起来像
var myUnmatchedAlphas = myAlphaItems.Where(alpha=>!myBravoItems.Any(bravo=>alpha.Id==bravo.Id));
而且对于unMatchedBravos也是如此。不幸的是,这会导致重复收集alpha(可能非常大!)很多次,并且收集bravos(也可能非常大!)很多次。
有什么办法统一这些查询概念,以便最大限度地减少对列表的迭代?这些集合可以有数千个项目。
我觉得对于一个HashSet你需要一个'的IEqualityComparer'而不是'IComparer'。而不是使用GetId方法,我只会执行'a.Id.CompareTo(b.Id)'(因为使用这个通用比较器,您将接收ABItems而不是对象)。 –
2010-11-04 17:49:24