3

我有一个从文件中读取并过滤的字符串列表,所有这些都是使用 yield 机制发生的,因此它是惰性的。然后我需要将它传递给一个采用 TextReader 的方法。

这种方法有什么问题吗?它似乎有效,但想知道我错过了一些东西。

public class EnumerableReader : TextReader
{
    private readonly IEnumerator<string> _enumerator;

    public EnumerableReader(IEnumerable<string> lines)
    {
        _enumerator = lines.GetEnumerator();
    }

    public override string ReadLine()
    {
        return _enumerator.MoveNext() ? _enumerator.Current : null;
    }

    protected override void Dispose(bool disposing)
    {
        _enumerator.Dispose();
        base.Dispose(disposing);
    }
}
4

1 回答 1

4

TextReader 类公开了多种读取数据的方法。如果您将实例传递给某些外部代码,它可能会使用任何方法,而不仅仅是ReadLine 方法

您至少需要覆盖的方法是Read MethodPeek Method。如果你不覆盖它们,它们都总是返回-1,表示已经到达终点。所有其他方法,包括ReadLine 方法,都提供基于Read 方法的默认实现。您可以覆盖它们(例如,为了提高性能),但不是必须的。

来自MSDN

继承人须知

派生类必须至少实现PeekRead方法才能创建有用的 TextReader 实例。

所以你的实现不能按原样工作。

于 2013-07-02T23:06:33.017 回答