是否有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