2011-02-07 3 views
0

안녕하세요, 저는 IEnumerator를 검색했지만 도움이 될만한 도움이 될만한 it.it을 이해할 수 없었습니다. IEnumerator의 목적은 무엇입니까

은 기본적으로이 코드

string requestUriString = URL; 
if (requestUriString.IndexOf("http://", StringComparison.InvariantCultureIgnoreCase) < 0) 
{ 
    requestUriString = "http://" + requestUriString; 
} 
WebRequest request = WebRequest.Create(requestUriString); 
try 
{ 
    IEnumerator enumerator; 
    StreamReader reader = new StreamReader(request.GetResponse().GetResponseStream(), Encoding.UTF8); 
    string sSourceString = reader.ReadToEnd(); 
    reader.Close(); 
    string str6 = this.funcParseStringFromString2String(sSourceString, "<div class=\"title\">", "<div class=\"searches_related\">", false); 
    ArrayList list = new ArrayList(); 
    list = this.funcParseStringFromString2Stringx(str6, "<h3><a ", "</h3>", false); 
    int num = this.DataGridView2.RowCount + 1; 
    try 
    { 
     enumerator = list.GetEnumerator(); 
     while (enumerator.MoveNext()) 
     { 
      string str8 = Conversions.ToString(enumerator.Current); 
      string str7 = this.funcParseStringFromString2String(str8, "title=\"", "\" href=", false); 
      string str5 = this.funcParseStringFromString2String(str8, "\" href=\"", "\">", false).Replace("\" class=\"rated", ""); 
      this.DataGridView2.Rows.Add(new string[] { Conversions.ToString(num), Conversions.ToString(false), str7, str5 }); 
      this.lblInsProg.Text = "Done: " + Conversions.ToString(this.DataGridView2.Rows.Count) + " Articles found"; 
      num++; 
     } 
    } 
    finally 
    { 
     if (enumerator is IDisposable) 
     { 
      (enumerator as IDisposable).Dispose(); 
     } 
    } 
    if (list.Count == 0) 
    { 
     this.lblInsProg.Text = "No results found for " + this.search.Text + "!"; 
     this.Button11.Enabled = false; 
    } 
    else 
    { 
     this.Button11.Enabled = true; 
    } 
    if (this.DataGridView2.RowCount != 0) 
    { 
     this.Button15.Visible = true; 
    } 
    return Conversions.ToString(0); 
} 
catch (WebException exception1) 
{ 
    ProjectData.SetProjectError(exception1); 
    WebException exception = exception1; 
    ProjectData.ClearProjectError(); 
} 
return Conversions.ToString(0); 
+2

나는 정말 당신과 같은 생각 코드하지 희망 ... 그것은 해당 버전에서 동일 적용되는 경우

이 깊이있는 책뿐만 아닙니다 ... 알고 있지만 유용 좋고 가치있는 것을 배울 가치가있는 것. –

+0

그렇습니다 ........ 코드 –

+0

일부 ....... * 코드 *가 있습니다. 나는 단지 당신이 사용하고 있거나, 글쓰기를하고, 배우기를 원하거나 프로덕션에 투입하는 코드가 범죄가 아닌 코드가 아니기를 바라고 있습니다. 그게 다야. 관심사를 표현하는 것.저를 믿으십시오, 그것은 당신 자신의 이익을위한 것입니다 :-) –

답변

7

코드의이 부분 :

try 
{ 
    enumerator = list.GetEnumerator(); 
    while (enumerator.MoveNext()) 
    { 
     string str8 = Conversions.ToString(enumerator.Current); 
     //... 
    } 
} 
finally 
{ 
    if (enumerator is IDisposable) 
    { 
     (enumerator as IDisposable).Dispose(); 
    } 
} 

은 기본적으로 동일하다 :

foreach(var value in list) 
{ 
    string str8 = Conversions.ToString(value); 
    //... 
} 

하지만, 후자는 훨씬 더 읽을 수, 당신은 생각하지 않아?

+0

예 락맨 –

0

그것은이 반복자의 역할을 이해하려고 노력. 내가 아는 한 멀리 따라야한다. Iterator pattern

1

IEnumerator 인터페이스는 코드의 while() {} 부분이 list을 하나씩 MoveNext() 메서드를 통해 반복 할 수있게 해준다.

그것은 C# "반복기"- 패턴 구현입니다. IEnumerator 인터페이스를 구현 한 클래스는 반복 할 수 있습니다. 종종 foreach syntactic sugar과 함께 사용됩니다.

글쓰기 다소 어색한 방법입니다. try/finally는 실제로 필요하지 않습니다.

var list = new ArrayList(); // (or a newer, generic container, like List<T>) 
... 
foreach (var item in list) 
{ 
    string str8 = Conversions.ToString(item); 
    ... 
} 
4

IEnumerator 당신이 등 목록, 배열을 반복 할 수 있습니다 (IEnumerable를 구현 아무것도) 각 요소를 하나씩 처리 : 나는 코드의 섹션은 다음과 같이 기대.

C#에서 foreach 루프에 익숙하다면, IEnumerator은 커버 아래에서 사용하는 것입니다. 예를 들어,이 :

List<string> myList = new List<string>() { "one", "two", "three" }; 

foreach(string elem in myList) 
{ 
    Console.WriteLine(elem); 
} 

실제로 이런 식으로 번역 :

List<string> myList = new List<string>() { "one", "two", "three" }; 

IEnumerator<string> enumerator = list.GetEnumerator(); 

while(enumerator.MoveNext()) 
{ 
    string elem = enumerator.Current; 

    Console.WriteLine(elem); 
} 

(다른 정리 작업이 foreach 그것이 IDisposable을 구현하는 경우 열거를 폐기 같이한다는 것을 있기 때문에 이것은, 단순화 이 부분은 관련 부분을 다룹니다.

실제로 try-finally 코드 블록은 foreach 구조가 번역 된 방법 IL에 ated.

관련 문제