AngleSharp by AngleSharp

<PackageReference Include="AngleSharp" Version="1.3.0" />

 CharArrayTextSource

Char array based immutable text source
using AngleSharp.Common; using System; using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace AngleSharp.Text { [System.Runtime.CompilerServices.NullableContext(1)] [System.Runtime.CompilerServices.Nullable(0)] public sealed class CharArrayTextSource : IReadOnlyTextSource, IDisposable { private int _index; [System.Runtime.CompilerServices.Nullable(2)] private string _content; private readonly char[] _array; [System.Runtime.CompilerServices.Nullable(0)] private readonly ReadOnlyMemory<char> _memory; private readonly int _length; public string Text => _content ?? (_content = new string(_array, 0, _length)); public char this[int index] { get { return _array[index]; } } public int Length => _length; public Encoding CurrentEncoding { get { return TextEncoding.Utf8; } set { } } public int Index { get { return _index; } set { _index = value; } } public CharArrayTextSource(char[] array, int length) { _array = array; _length = length; _memory = array.AsMemory(0, length); } public void Dispose() { } public char ReadCharacter() { if (_index < _length) return _array[_index++]; _index++; return '￿'; } public string ReadCharacters(int characters) { return ReadMemory(characters).ToString(); } public StringOrMemory ReadMemory(int characters) { int index = _index; if (index + characters <= _length) { _index += characters; return _memory.Slice(index, characters); } _index += characters; characters = Math.Min(characters, _length - index); return _memory.Slice(index, characters); } public Task PrefetchAsync(int length, CancellationToken cancellationToken) { return Task.CompletedTask; } public Task PrefetchAllAsync(CancellationToken cancellationToken) { return Task.CompletedTask; } public bool TryGetContentLength(out int length) { length = _length; return true; } } }