2009-06-20 2 views
0

나는 C# 반복자 (예 : IEnumerable)를 사용하는 리펙토 러를 사용하고 싶습니다. 불행히도 다른 함수들이 iterator를 다시 시작시키지 않으면 서 iterator로 작업 할 수있는 가장 좋은 방법을 알 수는 없습니다. 예를 들어반복기의 사용 방법을 리팩토링하는 방법

: 내가 이렇게 할 이유

NewLineEnumerator nle = new NewLineEnumerator(); 

while (bytesRead > 0) 
{ 
    var nlenum = nle.Process(inputData, bytesRead); 
    foreach (string block in nlenum) 
    { 
    DoSomething(nlenum); 
    } 
} 

void DoSomething(IEnumerable<string> myiter) 
{ 
    foreach (var s in myiter) 
    { 
    // myiter is restarted, and begins at the start of the iterator again 
    } 
} 

당신이 요구 될 수 있습니다. 그 이유는 "명령 블록"으로 둘러싸인 데이터 스트림이 있기 때문입니다. 명령에 따라 처리 할 다른 하위 함수로 보냅니다. 그래서 시작이나 끝에서 스트림에서 중단 한 부분을 반복하고 싶습니다.

여기에 어떤 제안이 있습니까?

답변

2

Nick이 말한 것처럼 IEnumerator<string>을 하나 만들고 메소드간에 전달합니다. 코드는 다음과 같습니다.

NewLineEnumerator nle = new NewLineEnumerator();

while (bytesRead > 0) 
{ 
    var nlenum = nle.Process(inputData, bytesRead); 
    using (var enumerator = nlenum.GetEnumerator()) 
    { 
     while (enumerator.MoveNext()) 
     { 
      DoSomething(enumerator); 
      Console.WriteLine(enumerator.Current); 
     } 
    } 

    // ensure that bytesRead is decremented by the code that runs above 
} 

void DoSomething(IEnumerator<string> myenum) 
{ 
    while (myenum.MoveNext()) 
    { 
     if (ShouldProcess(myenum.Current)) 
     { 
      // process it 
     } 
     else 
     { 
      // return to outer loop 
      break; 
     } 
    } 
} 

(당신이하지 IEnumerable<string>을 .NET 1.0 및 IEnumerable을 사용하는 경우 using 문이 컴파일되지 않을 수 있습니다.)

5

GetEnumerator()를 호출하여 IEnumerable 문자열 >이 아닌 < 문자열 >이 아닌 IEnumerator를 전달하십시오. 통화를 통해 상태를 유지합니다.

+0

그러나 foreach는 –

+0

에있는 IEnumerator를 사용할 수 없음 ,하지만 당신은 하나에서 일반 열거 형을 구축하고 전달할 수 있습니다. –

+0

당신은 정교 할 수 있습니까? –

관련 문제