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); }
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)); }
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)); }
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)); } }