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