2011-02-07 69 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

我真的希望這不是你作爲考慮碼值得借鑑的東西。 – 2011-02-07 21:40:31

+0

是的,這是一些........代碼 – 2011-02-07 21:50:17

回答

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); 
    //... 
} 

但後者更具可讀性,你不覺得嗎?

1

IEnumerator接口允許代碼循環的while() {}部分通過list逐一與所述的MoveNext()方法。

它是C#「迭代器」模式實現。任何實現了接口IEnumerator的類都可以迭代。通常它與foreach syntactic sugar一起使用。

這是一個有點馬虎的寫作方式。嘗試/最後並不是真的有必要。我期望的代碼的該部分看起來像這樣:

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構造如何獲得transl的絕對副本進入IL。