private static IEnumerable <TResult> JoinIterator <TOuter, TInner, TKey, TResult>(IEnumerable <TOuter> outer, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, TInner, TResult> resultSelector, IEqualityComparer <TKey> comparer) { using (IEnumerator <TOuter> e = outer.GetEnumerator()) { if (e.MoveNext()) { Lookup <TKey, TInner> lookup = Lookup <TKey, TInner> .CreateForJoin(inner, innerKeySelector, comparer); if (lookup.Count != 0) { do { TOuter item = e.Current; Grouping <TKey, TInner> g = lookup.GetGrouping(outerKeySelector(item), false); if (g != null) { int count = g.count; TInner[] elements = g.elements; for (int i = 0; i != count; ++i) { yield return(resultSelector(item, elements[i])); } } } while (e.MoveNext()); } } } }
private static IEnumerable <TResult> GroupJoinIterator <TOuter, TInner, TKey, TResult>(IEnumerable <TOuter> outer, IEnumerable <TInner> inner, Func <TOuter, TKey> outerKeySelector, Func <TInner, TKey> innerKeySelector, Func <TOuter, IEnumerable <TInner>, TResult> resultSelector, IEqualityComparer <TKey> comparer) { using (IEnumerator <TOuter> e = outer.GetEnumerator()) { if (e.MoveNext()) { Lookup <TKey, TInner> lookup = Lookup <TKey, TInner> .CreateForJoin(inner, innerKeySelector, comparer); do { TOuter item = e.Current; yield return(resultSelector(item, lookup[outerKeySelector(item)])); }while (e.MoveNext()); } } }