private IEnumerable <string> _readLines(Stream stream, Encoding encoding)
        {
            var buffer   = new byte[512];
            var decoder  = encoding.GetDecoder();
            var readSize = buffer.Length;
            var esb      = new ExtendedStringBuilder();

            while (stream.Position < stream.Length)
            {
                var remaining = stream.Length - stream.Position;

                if (remaining < buffer.Length)
                {
                    readSize = (int)remaining;
                }

                stream.Read(buffer, 0, readSize);

                var chars = new char[decoder.GetCharCount(buffer, 0, readSize)];
                decoder.GetChars(buffer, 0, readSize, chars, 0);

                foreach (char c in chars)
                {
                    esb += c;
                }

                if (esb.Contains(RowDelimiter))
                {
                    string   str   = esb;
                    string[] parts = str.QuotedSplit(RowDelimiter).ToArray();

                    for (int i = 0; i < parts.Length - 1; i++)
                    {
                        yield return(parts[i]);
                    }

                    esb.Length = 0;
                    esb       += parts[parts.Length - 1];
                }
            }

            {
                string   str   = esb;
                string[] parts = str.QuotedSplit(RowDelimiter).ToArray();

                for (int i = 0; i < parts.Length; i++)
                {
                    yield return(parts[i]);
                }
            }
        }