假设我有以下代码:
foreach(string str in someObj.GetMyStrings())
{
// do some stuff
}
Run Code Online (Sandbox Code Playgroud)
将someObj.GetMyStrings()在循环的每次迭代中调用?改为做以下事情会更好吗:
List<string> myStrings = someObj.GetMyStrings();
foreach(string str in myStrings)
{
// do some stuff
}
Run Code Online (Sandbox Code Playgroud)
?
Jon*_*eet 48
该函数只调用一次,返回一个IEnumerator<T>; 之后,MoveNext()方法和Current属性用于迭代结果:
foreach (Foo f in GetFoos())
{
// Do stuff
}
Run Code Online (Sandbox Code Playgroud)
有点相当于:
using (IEnumerator<Foo> iterator = GetFoos().GetEnumerator())
{
while (iterator.MoveNext())
{
Foo f = iterator.Current;
// Do stuff
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,迭代器位于末尾 - 这对于从迭代器块处理资源尤其重要,例如:
public IEnumerable<string> GetLines(string file)
{
using (TextReader reader = File.OpenText(file))
{
string line;
while ((line = reader.ReadLine()) != null)
{
yield return line;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,您确实希望在完成迭代时关闭该文件,并且编译器会IDisposable狡猾地实现该工作.
| 归档时间: |
|
| 查看次数: |
3173 次 |
| 最近记录: |