public static IEnumerable <TSource> Except <TSource>(IEnumerable <TSource> first, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer = null) { return(EnumerableUtil.Where(first, x => EnumerableUtil.FirstOrDefault(second, y => comparer != null ? comparer.Equals(x, y) : x.Equals(y)) == null)); }
public static IEnumerable <TResult> Join <TOuter, TInner, TKey, TResult>(IEnumerable <TOuter> outer, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector) where TKey : IComparable <TKey> { return(EnumerableUtil.SelectMany(outer, o => EnumerableUtil.Select( EnumerableUtil.Where(inner, i => outerKeySelector(o).CompareTo(innerKeySelector(i)) == 0), i => resultSelector(o, i)))); }