2011-02-07 19 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を1つずつ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); 
} 

(これは単純化され、それはIDisposableを実装している場合foreachが列挙子を配置するように、ないこと、その他のクリーンアップ操作があると実際には、try-finallyコードブロック全体は、foreach構造体がどのように翻訳されるのかということでは、ほとんど死んでいます。 ILに襲われた。

関連する問題