我希望能在字符流中任意定位并获取相应的行号。在Java中,可以使用java.io.LineNumberReader.getLineNumber()方法来透明地处理此问题。
那么在C#中,最好的方法是什么呢?
我希望能在字符流中任意定位并获取相应的行号。在Java中,可以使用java.io.LineNumberReader.getLineNumber()方法来透明地处理此问题。
那么在C#中,最好的方法是什么呢?
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;
}
可能Java已经设计了一个有状态的文本流读取器,而.NET将在未来10年内实现它。
如果您不想等待,可以编写一个包装类(有状态),将所需的功能添加到.NET TextReader
类中。您只需要在流向前移动时计算换行符即可。显然,这个类会比原始类慢,因此将此功能作为可选项是一个好主意。