如何在C#中透明地跟踪字符流中的行号?

时间:2010-10-18 01:45:32

标签: c#

我想寻找字符流中的任意点,然后获取相应的行号。在Java中,可以使用java.io.LineNumberReader.getLineNumber()方法透明地处理它。

在C#中解决这个问题的最佳方法是什么?

3 个答案:

答案 0 :(得分:3)

在.NET中没有类似的内容使用ReadLine()方法并自行跟踪行号。

答案 1 :(得分:0)

一种可能的解决方案是派生自己的流类并覆盖读/读/写功能,以便您可以自己跟踪新行。另一种可能的解决方案是在流上操作以执行所需操作的方法:

        static int LineNumber(System.IO.Stream s)
        {
            byte[] buffer = new byte[s.Length];
            s.Read(buffer, 0, (int)s.Length);
            string text = System.Text.Encoding.ASCII.GetString(buffer);            
            int idx = 0;
            int line = 0;
            do
            {
                idx = text.IndexOf('\n', idx);
                if (idx > -1)
                {
                    line++;
                    if (s.Position <= idx)
                        return line;
                    if (idx < text.Length - 1)
                        idx++;
                }
                else
                {
                    if (line > 0)
                        return line;
                    else
                        break;
                }
            } while (true);
            return 1;
        }

答案 2 :(得分:0)

可能Java已经设计了一个有状态的文本流阅读器,.NET将在未来10年内实现它。

如果您不打算等待,您应该在.NET TextReader类周围编写一个包装类(有状态),为类添加所需的功能。您只需要在流前进时计算新行字符。很明显,这个类比原来的类慢,所以使这个特性成为可选的是一个好主意。