在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循环。用迭代器声明要读的行。我试了些办法,但都没有成功什么好主意吗?

在for循环中使用yield

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包装可枚举代码会导致它提前处置,然而,我运行了你的代码,它工作得很好!

或者,如果您喜欢编写更少的代码,您可以使用File来完成相同的事情。readline
foreach (var line in File.ReadLines(file_path))
{
    ...
}