示例#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
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }