C# IEnumerator的用途是什么
大家好,我搜索了IEnumerator,但无法理解它。如果有人帮助我,那将是巨大的帮助 基本上是试图理解它在代码中的作用C# IEnumerator的用途是什么,c#,C#,大家好,我搜索了IEnumerator,但无法理解它。如果有人帮助我,那将是巨大的帮助 基本上是试图理解它在代码中的作用 string requestUriString = URL; if (requestUriString.IndexOf("http://", StringComparison.InvariantCultureIgnoreCase) < 0) { requestUriString = "http://" + requestUriString; } WebReque
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,我不知道该版本中是否涵盖了相同的内容
这不像这本书那么深入,但这很有用。。。
我真的希望这不是一个你认为是好的东西,值得学习的代码。是的……代码我看到它是一些……代码。我只是希望它不是你正在使用的代码,写作,尝试学习或永远投入生产(这将被视为犯罪)。.仅此而已。只是表达一种关切。相信我,这是为了你好:-)