在for循环中使用yield

时间:2013-06-19 09:29:17

标签: c#

我有这样的功能来读取大的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说明要读取的行。 我试了一下,但我的尝试没有成功 有什么想法吗?

1 个答案:

答案 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))
{
    ...
}