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))));
 }