从流读取器读取一行而不消耗?

Cra*_*893 25 c# readline streamreader gedcom

有没有办法提前读取一行来测试下一行是否包含特定的标签数据?

我正在处理一个具有开始标记但没有结束标记的格式.

我想读一行将它添加到一个结构然后测试下面的行,以确保它不是一个新的"节点",如果它不是继续添加,如果它是关闭该结构并创建一个新的

我能想到的唯一解决方案就是让两个流读取器在同一时间沿着锁定步骤出现,但这看起来很浪费(如果它甚至可以工作)

我需要像peek但peekline这样的东西

Nic*_*ong 29

问题是潜在的流可能甚至不可寻求.如果您查看流读取器实现,它会使用缓冲区,因此即使流不可搜索,它也可以实现TextReader.Peek().

您可以编写一个简单的适配器来读取下一行并在内部缓冲它,如下所示:

 public class PeekableStreamReaderAdapter
    {
        private StreamReader Underlying;
        private Queue<string> BufferedLines;

        public PeekableStreamReaderAdapter(StreamReader underlying)
        {
            Underlying = underlying;
            BufferedLines = new Queue<string>();
        }

        public string PeekLine()
        {
            string line = Underlying.ReadLine();
            if (line == null)
                return null;
            BufferedLines.Enqueue(line);
            return line;
        }


        public string ReadLine()
        {
            if (BufferedLines.Count > 0)
                return BufferedLines.Dequeue();
            return Underlying.ReadLine();
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 我稍微扩展了这个,所以该类继承自TextReader:https://gist.github.com/1317325 (7认同)
  • 我会在使用之前初始化`BufferedLines` :)而且,我会为PeekLine()使用另一个名称,因为名称表明它总是返回相同的行(从最后一个ReadLine的位置开始的下一行).已投票+1 (2认同)