0

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

4

1 回答 1

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;
    }
}


我错误地认为在使用 a 包裹可枚举代码的同时使用 yieldusing会导致它提前释放,但是,我运行了您的代码,它工作正常!

或者,如果您想编写更少的代码,您可以使用File.ReadLines完成同样的事情

foreach (var line in File.ReadLines(file_path))
{
    ...
}
于 2013-06-19T09:34:41.887 回答