Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IEnumerator的用途是什么_C# - Fatal编程技术网

C# IEnumerator的用途是什么

C# IEnumerator的用途是什么,c#,C#,大家好,我搜索了IEnumerator,但无法理解它。如果有人帮助我,那将是巨大的帮助 基本上是试图理解它在代码中的作用 string requestUriString = URL; if (requestUriString.IndexOf("http://", StringComparison.InvariantCultureIgnoreCase) < 0) { requestUriString = "http://" + requestUriString; } WebReque

大家好,我搜索了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);
string requestUriString=URL;
if(requestUriString.IndexOf(“http://”,StringComparison.InvariantCultureIgnoreCase)<0)
{
requestUriString=“http://”+requestUriString;
}
WebRequest=WebRequest.Create(requestUriString);
尝试
{
IEnumerator枚举器;
StreamReader=新的StreamReader(request.GetResponse().GetResponseStream(),Encoding.UTF8);
字符串sSourceString=reader.ReadToEnd();
reader.Close();
string str6=this.funcParseStringFromString2String(ssourcstring,“,”,false);
ArrayList=新建ArrayList();

list=this.funcParseStringFromString2Stringx(str6),“这是一个迭代器。据我所知,IEnumerator接口允许代码的
while()
{}部分通过MoveNext()方法逐个循环
list

它是C#“迭代器”模式实现。任何实现接口IEnumerator的类都可以被迭代。它通常与一起使用

这是一种有点草率的编写方式。try/finally并不是真正必要的。我希望代码的这一部分如下所示:

var list = new ArrayList(); // (or a newer, generic container, like List<T>)
...
foreach (var item in list)
{
    string str8 = Conversions.ToString(item);
    ...
}
List<string> myList = new List<string>() { "one", "two", "three" };

IEnumerator<string> enumerator = list.GetEnumerator();

while(enumerator.MoveNext())
{
    string elem = enumerator.Current;

    Console.WriteLine(elem);
}
var list=new ArrayList();//(或更新的通用容器,如list)
...
foreach(列表中的变量项)
{
string str8=Conversions.ToString(项目);
...
}

IEnumerator
允许您迭代列表、数组等(任何实现
IEnumerable
)并逐个处理每个元素

如果您熟悉C#中的
foreach
循环,
IEnumerator
就是它在封面下的用途。例如:

List<string> myList = new List<string>() { "one", "two", "three" };

foreach(string elem in myList)
{
    Console.WriteLine(elem);
}
List myList=newlist(){“一”、“二”、“三”};
foreach(myList中的字符串元素)
{
控制台写入线(elem);
}
实际上是这样翻译的:

var list = new ArrayList(); // (or a newer, generic container, like List<T>)
...
foreach (var item in list)
{
    string str8 = Conversions.ToString(item);
    ...
}
List<string> myList = new List<string>() { "one", "two", "three" };

IEnumerator<string> enumerator = list.GetEnumerator();

while(enumerator.MoveNext())
{
    string elem = enumerator.Current;

    Console.WriteLine(elem);
}
List myList=newlist(){“一”、“二”、“三”};
IEnumerator枚举器=list.GetEnumerator();
while(枚举数.MoveNext())
{
string elem=枚举数.Current;
控制台写入线(elem);
}
(这是简化的,因为
foreach
还有其他清理操作,例如如果枚举器实现了
IDisposable
,则处理枚举器,但这解决了相关部分)

事实上,您的整个
try finally
代码块几乎是
foreach
构造如何转换为IL的一个死拷贝。

这部分代码:

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

但后者更具可读性,你不认为吗?

我会深入阅读乔恩·斯基特的书C,这是我所见过的最好的解释,尽管我所指的书的版本是3,而现在出版的版本是4,我不知道该版本中是否涵盖了相同的内容

这不像这本书那么深入,但这很有用。。。
我真的希望这不是一个你认为是好的东西,值得学习的代码。是的……代码我看到它是一些……代码。我只是希望它不是你正在使用的代码,写作,尝试学习或永远投入生产(这将被视为犯罪)。.仅此而已。只是表达一种关切。相信我,这是为了你好:-)