2011-02-07 91 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。