是否有Java的LineNumberReader的C#等价物?

时间:2010-11-14 23:58:03

标签: c#

是否存在与Java LineNumberReader相当的C#?

即。一个StreamReader.ReadLine(),它保留了行号的计数。或者是通过创建StreamReader的自定义子类来实现此目的的唯一方法,并在重写方法中实现必要的计数?

2 个答案:

答案 0 :(得分:3)

.NET Framework中没有直接的等效项。

如果您创建自定义类,我建议您创建一个扩展TextReader并包装TextReader实例的类,以便它可以与任何TextReader子类一起使用({{3 },StreamReader)。

至少,您需要覆盖StringReaderTextReader.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有效。