IEnumerator的目的是什么?

时间:2011-02-07 21:37:10

标签: c#

大家好我搜索了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);

5 个答案:

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

但后者更具可读性,你不觉得吗?

答案 1 :(得分: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的死角复制品。

答案 2 :(得分:1)

IEnumerator接口允许while() {}部分代码使用MoveNext()方法逐个循环list

它是C#“iterator” - 模式实现。任何实现接口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);
    ...
}

答案 3 :(得分:0)

这是一个迭代器。据我所知,它遵循Iterator pattern

答案 4 :(得分:0)

我会深入阅读Jon Skeet的书C#,这是我见过的最好的解释,虽然我所指的书的版本是3,现在的版本是4 - 我不知道如果它在该版本中被覆盖相同...

这不像书那么深入,但这很有用...... http://www.yoda.arachsys.com/csharp/csharp2/iterators.html