4

完全なデータをメモリに保持できないことを認識しているため、一部をメモリにストリーミングして処理し、書き戻したいと考えています。

Yield は非常に便利なキーワードです。これにより、列挙子を使用してインデックスを保存する手間が省けます....

しかし、IEnumerableyield を介してシフトし、それらをコレクション/ファイルに書き戻したい場合、列挙子の概念を使用する必要がありますか、または yield の反対のようなものがありますか? RX について調べていますが、問題が解決するかどうかわかりません。

    public static IEnumerable<string> ReadFile()
    {
        string line;

        var reader = new System.IO.StreamReader(@"c:\\temp\\test.txt");
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }

        reader.Close();
    }

    public static void StreamFile()
    {
        foreach (string line in ReadFile())
        {
            WriteFile(line);
        }
    }

    public static void WriteFile(string line)
    {
        // how to save the state, of observe an collection/stream???
        var writer = new System.IO.StreamWriter("c:\\temp\\test.txt");
        writer.WriteLine(line);

        writer.Close();
    }
4

1 に答える 1

4

あなたの場合、IEnumerable<string>WriteFileに直接渡すことができます:

public static void WriteFile(IEnumerable<string> lines)
{
    // how to save the state, of observe an collection/stream???
    using(var writer = new System.IO.StreamWriter("c:\\temp\\test.txt"))
    {
        foreach(var line in lines)
            writer.WriteLine(line);
    }
}

入力は を介し​​てストリーミングされるためIEnumerable<T>、データがメモリに保持されることはありません。

この場合、 をFile.ReadLines介してすでに結果をストリーミングしているため、 を使用して読み取りを実行できますIEnumerable<string>。を使用File.WriteAllLinesすると、コードは次のように実行できます (ただし、単に を使用することもできますFile.Copy):

File.WriteAllLines(outputFile, File.ReadLines(inputFile));
于 2013-09-05T22:08:42.157 に答える