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

4

我希望能在字符流中任意定位并获取相应的行号。在Java中,可以使用java.io.LineNumberReader.getLineNumber()方法来透明地处理此问题。

那么在C#中,最好的方法是什么呢?


我非常确定,如果不读取文件而是寻找,获取行号在物理上是不可能的 - 我很想看看Java实现是如何工作的。 - Justin
3个回答

3
在.NET中没有这样的东西。使用ReadLine()方法并自己跟踪行号。

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;
        }

0

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

如果您不想等待,可以编写一个包装类(有状态),将所需的功能添加到.NET TextReader类中。您只需要在流向前移动时计算换行符即可。显然,这个类会比原始类慢,因此将此功能作为可选项是一个好主意。


我们为什么要使用惰性求值呢?它会在需要计算时才进行计算。 - greenoldman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接