К сожалению,
Enumerable.Intersect
не сработает, поскольку вы сравниваете два разных типа (A
и B
).
Для получения вызова Intersect, который будет работать, потребуется отдельная обработка.
Вы можете сделать это поэтапно:
IEnumerable<A> GetMatches(IEnumerable<A> collectionA, IEnumerable<B> collectionB)
where A : ISomeConstraintWithValueProperty
where B : ISomeOtherConstraintWithSameValueProperty
{
// Get distinct values in A
var values = new HashSet<TypeOfValue>(collectionB.Select(b => b.Value));
return collectionA.Where(a => values.Contains(a.Value));
}
Обратите внимание, что это будет возвращать дубликаты, если collectionB
содержит дубликаты (но не collectionA), поэтому результаты будут немного отличаться от вашего кода зацикливания.
Если вы хотите уникальные совпадения (возвращается только одно), вы можете изменить последнюю строку на:
return collectionA.Where(a => values.Contains(a.Value)).Distinct();