示例#1
0
        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());
                    }
                }
            }
        }
示例#2
0
        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());
                }
            }
        }