mujiansu / morelinq

Automatically exported from code.google.com/p/morelinq
Apache License 2.0
0 stars 0 forks source link

Except and Intersect overloads that take delegates #80

Open GoogleCodeExporter opened 8 years ago

GoogleCodeExporter commented 8 years ago
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

GoogleCodeExporter commented 8 years ago
This issue has been migrated to:
https://github.com/MoreLINQ/morelinq/issues/80
The conversation continues there.
DO NOT post any further comments to the issue tracker on Google Code as it is 
shutting down.
You can also just subscribe to the issue on GitHub to receive notifications of 
any further development.

Original comment by azizatif on 21 Aug 2015 at 6:55