2013-07-02 3 views
2

파일에서 읽어 들이고 필터링되는 문자열 목록을 가지고 있습니다.이 모든 것은 yield 메커니즘을 사용하여 일어나기 때문에 게으르다. 그런 다음이를 TextReader를 사용하는 메서드로 전달해야합니다.IEnumerable 스트리밍

이 방법에 문제가 있습니까? 그것은 효과가있는 것처럼 보이지만 뭔가를 놓친 것을 알고 싶었습니다.

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); 
    } 
} 
+0

끝나면 IEnumerator 을 '폐기'하는 것을 잊지 마십시오. – dtb

+0

@dtb 왜이 경우에는 _enumerator를 적극적으로 폐기하는 것이 필요하면 가비지 컬렉터가 처리하는 것보다 더 나은지 궁금하다. 메모리 소비? –

+2

@SimonBelanger : 일반적으로 IDisposables *를 처리하기 때문에 *. 이 상황에서 IEnumerator는 파일에서 읽습니다. GC가 결국 파일을 닫을 때까지 파일을 열어 두지 않고 확정적으로 닫고 싶지는 않을 것입니다. – dtb

답변

3

TextReader Class은 데이터를 읽는 여러 가지 방법을 제공합니다. 인스턴스를 외부 코드에 전달하면 ReadLine Method뿐만 아니라 모든 방법을 사용할 수 있습니다.

최소한 재정의해야하는 방법은 Read MethodPeek Method입니다. 그것들을 오버라이드 (override)하지 않는 경우는, 항상 양쪽 모두 -1이 돌려 주어져 그 말미에 이른 것을 나타냅니다. ReadLine Method을 포함한 다른 모든 방법은 Read Method을 기반으로하는 기본 구현을 제공합니다. 성능을 향상시키기 위해이를 무시할 수 있지만 필수는 아닙니다. MSDN에서

:

노트

이 파생 클래스는 최소한 TextReader를 유용한 인스턴스를 만들기 위해 PeekRead 방법을 구현해야합니다 상속자합니다.

따라서 구현이 그대로 작동하지 않습니다.

+0

Stream을 사용하는 Method가 오직'ReadLine()'만을 호출한다면? – Schotime

+1

@Schotime 만약 당신이 알고 있다면, 당신은 아마'TextReader'를 사용해서는 안되며, 커스텀 타입을 사용해야합니다. – svick