我想寻找字符流中的任意点,然后获取相应的行号。在Java中,可以使用java.io.LineNumberReader.getLineNumber()方法透明地处理它。
在C#中解决这个问题的最佳方法是什么?
答案 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
类周围编写一个包装类(有状态),为类添加所需的功能。您只需要在流前进时计算新行字符。很明显,这个类比原来的类慢,所以使这个特性成为可选的是一个好主意。