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 でラップしながら yield を使用すると、早期に破棄されると誤って想定しましたが、コードを実行したところ、正常に動作しました!using

あるいは、より少ないコードを書きたい場合は、 File.ReadLinesを使用して同じことを達成できます。

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