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()); } } } }
internal static Lookup <TKey, TElement> Create(IEnumerable <TElement> source, Func <TElement, TKey> keySelector, IEqualityComparer <TKey> comparer) { Debug.Assert(source != null); Debug.Assert(keySelector != null); Lookup <TKey, TElement> lookup = new Lookup <TKey, TElement>(comparer); foreach (TElement item in source) { lookup.GetGrouping(keySelector(item), create: true).Add(item); } return(lookup); }
internal static Lookup <TKey, TElement> CreateForJoin(IEnumerable <TElement> source, Func <TElement, TKey> keySelector, IEqualityComparer <TKey> comparer) { Lookup <TKey, TElement> lookup = new Lookup <TKey, TElement>(comparer); foreach (TElement local in source) { TKey key = keySelector(local); if (key != null) { lookup.GetGrouping(key, true).Add(local); } } return(lookup); }
internal static Lookup <TKey, TElement> Create <TSource>(IEnumerable <TSource> source, Func <TSource, TKey> keySelector, Func <TSource, TElement> elementSelector, IEqualityComparer <TKey> comparer) { if (source == null) { throw Error.ArgumentNull("source"); } if (keySelector == null) { throw Error.ArgumentNull("keySelector"); } if (elementSelector == null) { throw Error.ArgumentNull("elementSelector"); } Lookup <TKey, TElement> lookup = new Lookup <TKey, TElement>(comparer); foreach (TSource local in source) { lookup.GetGrouping(keySelector(local), true).Add(elementSelector(local)); } return(lookup); }