internal static LookupDefaultEnumerable <TKey, TItem> ToLookupImpl <TItem, TKey, TEnumerator>(
            ref TEnumerator source,
            Func <TItem, TKey> keySelector
            )
            where TEnumerator : struct, IStructEnumerator <TItem>
        {
            var hashtable = new LookupHashtable <TKey, TItem>();

            hashtable.Initialize();

            while (source.MoveNext())
            {
                var item = source.Current;
                var key  = keySelector(item);
                hashtable.Add(key, item);
            }

            return(new LookupDefaultEnumerable <TKey, TItem>(ref hashtable));
        }
        internal static LookupDefaultEnumerable <TKey, TElement> ToLookupImpl <TItem, TKey, TElement, TEnumerable, TEnumerator>(
            ref TEnumerable source,
            Func <TItem, TKey> keySelector,
            Func <TItem, TElement> elementSelector
            )
            where TEnumerable : struct, IStructEnumerable <TItem, TEnumerator>
            where TEnumerator : struct, IStructEnumerator <TItem>
        {
            var hashtable = new LookupHashtable <TKey, TElement>();

            hashtable.Initialize();

            foreach (var item in source)
            {
                var key     = keySelector(item);
                var element = elementSelector(item);
                hashtable.Add(key, element);
            }

            return(new LookupDefaultEnumerable <TKey, TElement>(ref hashtable));
        }
        internal static LookupSpecificEnumerable <TKey, TItem> ToLookupImpl <TItem, TKey, TEnumerator>(
            ref TEnumerator source,
            Func <TItem, TKey> keySelector,
            IEqualityComparer <TKey> comparer
            )
            where TEnumerator : struct, IStructEnumerator <TItem>
        {
            comparer = comparer ?? EqualityComparer <TKey> .Default;

            var hashtable = new LookupHashtable <TKey, TItem>();

            hashtable.Initialize();

            while (source.MoveNext())
            {
                var item = source.Current;
                var key  = keySelector(item);
                hashtable.Add(key, item, comparer);
            }

            return(new LookupSpecificEnumerable <TKey, TItem>(ref hashtable, comparer));
        }
        internal static LookupSpecificEnumerable <TKey, TElement> ToLookupImpl <TItem, TKey, TElement, TEnumerable, TEnumerator>(
            ref TEnumerable source,
            Func <TItem, TKey> keySelector,
            Func <TItem, TElement> elementSelector,
            IEqualityComparer <TKey> comparer
            )
            where TEnumerable : struct, IStructEnumerable <TItem, TEnumerator>
            where TEnumerator : struct, IStructEnumerator <TItem>
        {
            comparer = comparer ?? EqualityComparer <TKey> .Default;
            var hashtable = new LookupHashtable <TKey, TElement>();

            hashtable.Initialize();

            foreach (var item in source)
            {
                var key     = keySelector(item);
                var element = elementSelector(item);

                hashtable.Add(key, element, comparer);
            }

            return(new LookupSpecificEnumerable <TKey, TElement>(ref hashtable, comparer));
        }