我有这样的功能来读取大的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循环一起使用。用Iterator说明要读取的行。 我试了一下,但我的尝试没有成功 有什么想法吗?
答案 0 :(得分:4)
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
包装的可枚举代码会导致它提前处理,但是,我运行了你的代码,它工作正常!
或者,如果您想要编写 less 代码,您可以使用File.ReadLines完成同样的事情
foreach (var line in File.ReadLines(file_path))
{
...
}