public KeyValuePair <TKey, TValue>[] Decode <TKey, TValue>([NotNull] FdbSubspace subspace, [NotNull] IKeyEncoder <TKey> keyEncoder, [NotNull] IValueEncoder <TValue> valueEncoder)
        {
            if (subspace == null)
            {
                throw new ArgumentNullException("subspace");
            }
            if (keyEncoder == null)
            {
                throw new ArgumentNullException("keyEncoder");
            }
            if (valueEncoder == null)
            {
                throw new ArgumentNullException("valueEncoder");
            }

            var chunk   = this.Chunk;
            var results = new KeyValuePair <TKey, TValue> [chunk.Length];

            for (int i = 0; i < chunk.Length; i++)
            {
                results[i] = new KeyValuePair <TKey, TValue>(
                    keyEncoder.DecodeKey(subspace.ExtractKey(chunk[i].Key, boundCheck: true)),
                    valueEncoder.DecodeValue(chunk[i].Value)
                    );
            }

            return(results);
        }
        public T[] DecodeKeys <T>([NotNull] FdbSubspace subspace, [NotNull] IKeyEncoder <T> keyEncoder)
        {
            if (subspace == null)
            {
                throw new ArgumentNullException("subspace");
            }
            if (keyEncoder == null)
            {
                throw new ArgumentNullException("keyEncoder");
            }

            var results = new T[this.Count];

            for (int i = 0; i < results.Length; i++)
            {
                results[i] = keyEncoder.DecodeKey(subspace.ExtractKey(this.Chunk[i].Key, boundCheck: true));
            }
            return(results);
        }