private void UpdateSortedValues(EnhancedSortedSet <TValue> bucket, TValue?previousLast) { TValue?newLast = bucket.Max; if (!Equals(previousLast, newLast)) { if (previousLast is not null) { _worstSortedValues.Remove(previousLast); } _worstSortedValues.Add(newLast, GetKey(newLast)); } }
/// <summary> /// Actual insert mechanism. /// </summary> protected virtual void InsertCore(TKey key, TValue value, TGroupKey groupKey) { if (!_buckets.TryGetValue(groupKey, out EnhancedSortedSet <TValue> bucket)) { _buckets[groupKey] = bucket = new EnhancedSortedSet <TValue>(_groupComparer); } TValue?last = bucket.Max; if (bucket.Add(value)) { _cacheMap[key] = value; UpdateSortedValues(bucket, last); Inserted?.Invoke(this, new SortedPoolEventArgs(key, value, groupKey)); } }
public IEnumerable <TValue> TakeWhile(TGroupKey groupKey, Predicate <TValue> where) { if (_buckets.TryGetValue(groupKey, out EnhancedSortedSet <TValue>?bucket)) { using EnhancedSortedSet <TValue> .Enumerator enumerator = bucket !.GetEnumerator(); List <TValue>?list = null; while (enumerator.MoveNext()) { if (!where (enumerator.Current)) { break; } list ??= new List <TValue>(); list.Add(enumerator.Current); } return(list ?? Enumerable.Empty <TValue>()); } return(Enumerable.Empty <TValue>()); }