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); }
protected ProgressiveLookup(Progressor <IGrouping <TKey, T> > progressor, NullAwareDictionary <TKey, IGrouping <TKey, T> > cache, IEqualityComparer <TKey>?keyComparer, IEqualityComparer <T>?itemComparer) { _cache = cache ?? throw new ArgumentNullException(nameof(cache)); Progressor = progressor ?? throw new ArgumentNullException(nameof(progressor)); _subscription = Progressor.SubscribeAction(obj => _cache.Add(obj.Key, obj)); Comparer = keyComparer ?? EqualityComparer <TKey> .Default; ItemComparer = itemComparer ?? EqualityComparer <T> .Default; Keys = EnumerationList <TKey> .Create(this.ConvertProgressive(input => input.Key)); }
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)); }
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)); }