是否有C#相当于Java的LineNumberReader?是否有Java的LineNumberReader的C#等价物?
即保持行号计数的StreamReader.ReadLine()
。或者是通过创建StreamReader的自定义子类来实现此目的的唯一方法,并在重写的方法中实现必要的计数?
是否有C#相当于Java的LineNumberReader?是否有Java的LineNumberReader的C#等价物?
即保持行号计数的StreamReader.ReadLine()
。或者是通过创建StreamReader的自定义子类来实现此目的的唯一方法,并在重写的方法中实现必要的计数?
在.NET Framework中没有直接的等价物。
如果你创建一个自定义类,我建议你创建扩展TextReader并包装TextReader实例类,所以它可以与任何TextReader子类(StreamReader,StringReader)一起使用。
至少,您需要覆盖TextReader.Read和TextReader.Peek方法。为了提高效率,您还应该覆盖TextReader类的所有其他虚拟方法。
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();
}
}
没有这样的功能。你必须保持一个局部变量,并增加或实现一个简单的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
有效。
没有,但实现一个是微不足道的。 – 2010-11-15 00:03:35