У меня есть две коллекции объектов разного типа. Назовите их типа ALPHA и тип BRAVO. Каждый из этих типов имеет свойство, которое является «ID» для объекта. Идентификатор не дублируется внутри класса, поэтому для любого идентификатора не более ALPHA и один BRAVO экземпляр. Что мне нужно сделать, это разделить их на 3 категории:LINQ Combine Queries
- экземплярам ID в ALPHA, которые не появляются в BRAVO коллекции;
- Экземпляры удостоверения личности в BRAVO которые не отображаются в ALPHA коллекция;
- Экземпляры идентификатора, которые отображаются в обеих коллекциях.
Во всех трех случаях для последующих манипуляций мне необходимо иметь фактические объекты из коллекций.
Я знаю, что для случая # 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. К сожалению, это приведет к многократной итерации коллекции альфов (которые могут быть очень большими!), А также сбор браво (который также может быть очень большим!) Много раз.
Есть ли способ унифицировать эти концепции запросов, чтобы минимизировать итерацию по спискам? Эти коллекции могут иметь тысячи предметов.
Я думаю, что для HashSet вам нужно '' IEqualityComparer вместо этого 'IComparer'. И вместо использования метода GetId я просто выполнил бы «a.Id.CompareTo (b.Id)» (потому что с этим общим компаратором вы получите ABItems вместо объектов). –