public static IEnumerable <TSource> Union <TSource>( this IEnumerable <TSource> first, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer = null) => Defer(() => { LinqToObjects.HashSet <TSource> hashSet = new LinqToObjects.HashSet <TSource>(comparer); return(first.Where(hashSet.Add).Concat(second.Where(hashSet.Add))); });
public static IEnumerable <TSource> Intersect <TSource>( this IEnumerable <TSource> first, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer = null) => Defer(() => { LinqToObjects.HashSet <TSource> hashSet = new LinqToObjects.HashSet <TSource>(comparer); second.Iterate(secondValue => hashSet.Add(secondValue)); return(first.Where(hashSet.Remove)); });
public static IEnumerable <TSource> Except <TSource>( this IEnumerable <TSource> first, IEnumerable <TSource> second, IEqualityComparer <TSource> comparer = null) => Defer(() => { comparer = comparer ?? EqualityComparer <TSource> .Default; LinqToObjects.HashSet <TSource> hashSet = new LinqToObjects.HashSet <TSource>(comparer); foreach (TSource secondValue in second) { hashSet.Add(secondValue); } return(first.Where(hashSet.Add)); });
public static IEnumerable <TSource> Distinct <TSource> (this IEnumerable <TSource> source, IEqualityComparer <TSource> comparer = null) => Defer(() => { LinqToObjects.HashSet <TSource> hashSet = new LinqToObjects.HashSet <TSource>(comparer); return(source.Where(hashSet.Add)); });