是否存在与Java LineNumberReader相当的C#?
即。一个StreamReader.ReadLine()
,它保留了行号的计数。或者是通过创建StreamReader的自定义子类来实现此目的的唯一方法,并在重写方法中实现必要的计数?
答案 0 :(得分:3)
.NET Framework中没有直接的等效项。
如果您创建自定义类,我建议您创建一个扩展TextReader并包装TextReader实例的类,以便它可以与任何TextReader子类一起使用({{3 },StreamReader)。
至少,您需要覆盖StringReader和TextReader.Read方法。为了提高效率,您还应该覆盖TextReader.Peek类的所有其他虚拟方法。
class LineNumberTextReader : TextReader
{
private readonly TextReader reader;
private int b;
private int line;
public LineNumberTextReader(TextReader reader)
{
if (reader == null) throw new ArgumentNullException("reader");
this.reader = reader;
}
public int Line
{
get { return this.line; }
}
public override int Peek()
{
return this.reader.Peek();
}
public override int Read()
{
int b = this.reader.Read();
if ((this.b == '\n') || (this.b == '\r' && b != '\n')) this.line++;
return this.b = b;
}
protected override void Dispose(bool disposing)
{
if (disposing) this.reader.Dispose();
}
}
答案 1 :(得分:1)
没有这样的功能。您必须保留一个局部变量并增加或实现一个简单的StreamReader:
public class CustomStreamReader : StreamReader
{
private int _lineNumber = 0;
public CustomStreamReader(Stream stream)
: base(stream)
{
}
public int LineNumber
{
get
{
return _lineNumber;
}
}
public override string ReadLine()
{
_lineNumber++;
return base.ReadLine();
}
}
请注意,此课程假设您只使用Stream
初始化它,并且您只会调用ReadLine()
。否则,您必须完全覆盖以确保LineNumber
有效。