Ejemplo n.º 1
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 new ArgumentNullException(nameof(source));
            }
            if (elementSelector == null)
            {
                throw new ArgumentNullException(nameof(elementSelector));
            }
            if (keySelector == null)
            {
                throw new ArgumentNullException(nameof(keySelector));
            }
            var nonNullComparer = comparer ?? EqualityComparer <TKey> .Default;
            var result          = new Lookup <TKey, TElement>(nonNullComparer);
            var collections     = new NullAwareDictionary <TKey, List <TElement> >(nonNullComparer);

            foreach (var item in source)
            {
                var key = keySelector(item);
                if (!collections.TryGetValue(key, out var collection))
                {
                    collection = new List <TElement>();
                    collections.Add(key, collection);
                }
                if (!result._groupings.TryGetValue(key, out var grouping))
                {
                    grouping = new Grouping <TKey, TElement>(key, collection);
                    result._groupings.Add(key, grouping);
                }
                collection.Add(elementSelector(item));
            }
            return(result);
        }
Ejemplo n.º 2
0
 public bool TryGetValue(T equalValue, out T actualValue)
 {
     if (_wrapped.TryGetValue(equalValue, out actualValue))
     {
         return(true);
     }
     actualValue = default !;
            public IEnumerator <IGrouping <TKey, TElement> > GetEnumerator()
            {
                var groupings = new NullAwareDictionary <TKey, Tuple <Grouping <TKey, TElement>, List <TElement> > >(_comparer);

                foreach (var item in _source)
                {
                    var key = _keySelector(item);
                    if (!groupings.TryGetValue(key, out var tuple))
                    {
                        var collection = new List <TElement>();
                        tuple = new Tuple <Grouping <TKey, TElement>, List <TElement> >(new Grouping <TKey, TElement>(key, collection), collection);
                        groupings.Add(key, tuple);
                    }
                    tuple.Item2.Add(_elementSelector(item));
                }
                return(Enumerator(groupings));
            }
Ejemplo n.º 4
0
            public IEnumerator <TResult> GetEnumerator()
            {
                var groupings = new NullAwareDictionary <TKey, Lookup <TKey, TElement> .Grouping>(_comparer);

                foreach (var item in _source)
                {
                    var key = _keySelector(item);
                    Lookup <TKey, TElement> .Grouping grouping;
                    if (!groupings.TryGetValue(key, out grouping))
                    {
                        grouping = new Lookup <TKey, TElement> .Grouping(key);

                        groupings.Add(key, grouping);
                    }
                    grouping.Items.Add(_elementSelector(item));
                }
                return(Enumerator(groupings));
            }
Ejemplo n.º 5
0
        public bool TryGetValue(TKey key, out IGrouping <TKey, T> value)
        {
            if (_cache.TryGetValue(key, out value))
            {
                return(true);
            }

            foreach (var found in ProgressorWhere(Check))
            {
                value = found;
                return(true);
            }

            return(false);

            bool Check(IGrouping <TKey, T> item)
            {
                return(Comparer.Equals(key, item.Key));
            }
        }