public IEnumerator <T> GetEnumerator() { using (var stream = _fileHeader.FileInfo.Open(FileMode.Open, FileAccess.Read, FileShare.Read)) { stream.Seek(_fileHeader.FileHeaderSize, SeekOrigin.Begin); while (stream.Position < stream.Length) { var blockCount = 0L; var blockSize = 0L; var blockData = default(byte[]); var blockSync = new byte[16]; using (var decoder = new BinaryDecoder(stream)) { blockCount = decoder.ReadLong(); blockSize = decoder.ReadLong(); } blockData = new byte[blockSize]; stream.Read(blockData.AsSpan()); stream.Read(blockSync.AsSpan()); if (!blockSync.SequenceEqual(_fileHeader.Sync)) { throw new Exception("Sync marker mismach"); } using (var memoryStream = CreateDataStream(blockData)) using (var decoder = new BinaryDecoder(memoryStream)) for (var i = 0L; i < blockCount; i++) { yield return(_reader.Read(decoder)); } } } }