2011-02-07 3 views
0

Привет всем Я искал IEnumerator, но не смог понять его. Это было бы большой помощью, если бы кто-нибудь мне помог.Какова цель 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

Да вы рок-человек –

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) и обрабатывать каждый элемент один за одним.

Если вы знакомы с петлей foreach в C#, то 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 является почти мертвой копией того, как создается конструкция в Ил.

0

Я хотел бы прочитать книгу Джона Скита C# по глубине, это лучшее объяснение этого, которое я видел, хотя версия книги, на которую я имею в виду, - это 3, а версия, которая сейчас отсутствует, - 4 знать, если она покрыта такой же в этой версии ...

Это не так в глубине, как книги, но это полезно ... http://www.yoda.arachsys.com/csharp/csharp2/iterators.html

Смежные вопросы