public async IAsyncEnumerable <(Pointer, StoredValue)> GetAllPointerValuesAsync() { switch (Type) { case MdType.Pointers: var pointers = LocateMany(GetAllPointersAsync().Select(c => c.MdLocator)); var allPointers = pointers.SelectMany(c => c.Value.GetAllPointerValuesAsync()).ConfigureAwait(false); await foreach (var item in allPointers) { yield return(item); } break; case MdType.Values: var keys = EnumerableExt.LongRange(StartIndex, (ulong)Count); foreach (var key in keys) { var val = await GetValueAsync(key).ConfigureAwait(false); if (!val.HasValue) { continue; } yield return(new Pointer { MdLocator = MdLocator, MdKey = $"{key}", ValueType = val.Value.ValueType }, val.Value); } break; default: throw new ArgumentOutOfRangeException(nameof(Type)); } }