Useful when you have one sequence, and you want to get the except/intersect
from another sequence based on a specific projection (like DistinctBy)
Originally sourced from here:
http://akshayluther.com/2009/08/14/improving-linq-except-and-intersect/
Additional overloads added where the two sequences have different types added -
since the Func doesn't really care if they're the same or not and therefore you
can just check equality inside.
Sample usage:
var toRemove = existingResults.Except(newResults, (x, y) => x.EntityId ==
y.EntityId && x.EntityType == y.EntityType);
Code:
public static IEnumerable<TSource> Except<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TSource, bool> comparer)
{
return first.Where(x => second.Count(y => comparer(x, y)) == 0);
}
public static IEnumerable<TSource> Intersect<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, Func<TSource, TSource, bool> comparer)
{
return first.Where(x => second.Count(y => comparer(x, y)) == 1);
}
public static IEnumerable<TFirstSource> Except<TFirstSource, TSecondSource>(this IEnumerable<TFirstSource> first, IEnumerable<TSecondSource> second, Func<TFirstSource, TSecondSource, bool> comparer)
{
return first.Where(x => second.Count(y => comparer(x, y)) == 0);
}
public static IEnumerable<TFirstSource> Intersect<TFirstSource, TSecondSource>(this IEnumerable<TFirstSource> first, IEnumerable<TSecondSource> second, Func<TFirstSource, TSecondSource, bool> comparer)
{
return first.Where(x => second.Count(y => comparer(x, y)) == 1);
}
Original issue reported on code.google.com by agr...@gmail.com on 9 Jul 2013 at 10:34
Original issue reported on code.google.com by
agr...@gmail.com
on 9 Jul 2013 at 10:34