在for循环中使用yield
本文关键字:yield for 循环 | 更新日期: 2023-09-27 18:18:57
我有这样的功能来读取大的txt文件
private static IEnumerable<string> ReadLineFromFile(TextReader fileReader)
{
using (fileReader)
{
string currentLine;
while ((currentLine = fileReader.ReadLine()) != null)
{
yield return currentLine;
}
}
}
yield只能用于foreach循环。
TextReader readFile = new StreamReader(file_path);
foreach (string url in ReadLineFromFile(readFile))
{
}
我需要重写这个函数来使用for循环。用迭代器声明要读的行。我试了些办法,但都没有成功什么好主意吗?
yield
关键字可以在任何迭代器块中使用,而不仅仅是foreach
-您的代码应该可以工作。
你的代码的问题是你在阅读第一行后处理
TextReader
。
将using
语句移出ReadLineFromFile
方法,即
using (var reader = new StreamReader(file_path))
{
foreach(string url in ReadLineFromFile(reader))
{
...
}
}
...
private static IEnumerable<string> ReadLineFromFile(TextReader fileReader)
{
while ((var currentLine = fileReader.ReadLine()) != null)
{
yield return currentLine;
}
}
我错误地假设使用yield,同时用using
包装可枚举代码会导致它提前处置,然而,我运行了你的代码,它工作得很好!
foreach (var line in File.ReadLines(file_path))
{
...
}