#if NET20 || NET30 || !NET_4_6 using System.Collections.Generic; namespace System.Linq.Reimplement { public static partial class Enumerable { public static IEnumerable GroupJoin(this IEnumerable outer, IEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func, TResult> resultSelector) { return GroupJoin(outer, inner, outerKeySelector, innerKeySelector, resultSelector, null); } public static IEnumerable GroupJoin(this IEnumerable outer, IEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func, TResult> resultSelector, IEqualityComparer comparer) { LinqCheck.JoinSelectors(outer, inner, outerKeySelector, innerKeySelector, resultSelector); if (comparer == null) { comparer = EqualityComparer.Default; } return CreateGroupJoinIterator(outer, inner, outerKeySelector, innerKeySelector, resultSelector, comparer); } private static IEnumerable CreateGroupJoinIterator(this IEnumerable outer, IEnumerable inner, Func outerKeySelector, Func innerKeySelector, Func, TResult> resultSelector, IEqualityComparer comparer) { // NOTICE this method has no null check var innerKeys = ToLookup(inner, innerKeySelector, comparer); foreach (var element in outer) { var outerKey = outerKeySelector(element); if (!ReferenceEquals(outerKey, null) && innerKeys.Contains(outerKey)) { yield return resultSelector(element, innerKeys[outerKey]); } else { yield return resultSelector(element, Empty()); } } } } } #endif