Рассматривая этот вопрос, на который Джон отлично справился, ответив ... ' Как реверсивно читать текстовый файл с помощью итератора '. И был похожий вопрос, на который я ответил, используя указатели hocus pocus .. ' .net есть способ прочитать текстовый файл снизу вверх ', прежде чем он закроется ....
Теперь я решил попытаться решить эту проблему с помощью указателей, ладно, по краям это выглядит грубо и грубо ...
public class ReadChar : IEnumerable<char>
{
private Stream _strm = null;
private string _str = string.Empty;
public ReadChar(string s)
{
this._str = s;
}
public ReadChar(Stream strm)
{
this._strm = strm;
}
public IEnumerator<char> GetEnumerator()
{
if (this._strm != null && this._strm.CanRead && this._strm.CanSeek)
{
return ReverseReadStream();
}
if (this._str.Length > 0)
{
return ReverseRead();
}
return null;
}
private IEnumerator<char> ReverseReadStream()
{
long lIndex = this._strm.Length;
while (lIndex != 0 && this._strm.Position != 0)
{
this._strm.Seek(lIndex--, SeekOrigin.End);
int nByte = this._strm.ReadByte();
yield return (char)nByte;
}
}
private IEnumerator<char> ReverseRead()
{
unsafe
{
fixed (char* beg = this._str)
{
char* p = beg + this._str.Length;
while (p-- != beg)
{
yield return *p;
}
}
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
но обнаружил, что компилятор C # не может справиться с этим с помощью этой реализации, но был опустошен, когда компилятор C # отказался с ошибкой CS1629 - «Небезопасный код может не отображаться в итераторах»
Почему это так?