MoreLINQ имеет ExceptBy
. У него пока нет IntersectBy
, но вы можете легко написать свою собственную реализацию и, возможно, впоследствии добавить ее в MoreLINQ:)
Вероятно, это будет выглядеть что-то примерно так (без проверки ошибок):
public static IEnumerable<TSource> IntersectBy<TSource, TKey>(
this IEnumerable<TSource> first,
IEnumerable<TSource> second,
Func<TSource, TKey> keySelector,
IEqualityComparer<TKey> keyComparer)
{
HashSet<TKey> keys = new HashSet<TKey>(first.Select(keySelector),
keyComparer);
foreach (var element in second)
{
TKey key = keySelector(element);
// Remove the key so we only yield once
if (keys.Remove(key))
{
yield return element;
}
}
}
Если вы хотите выполнить пересечение двух совершенно разных типов, которые имеют общий тип свойства, вы можете создать более общий метод с тремя параметрами типа (один для first
, один для second
и один для общего типа ключа).