【发布时间】:2023-03-29 23:01:01
【问题描述】:
我意识到我无法将完整的数据保存在内存中,因此我想将部分数据流式传输到内存中并使用它们,然后再将它们写回。
yield 是一个非常有用的关键字,它省去了使用枚举器和保存索引的所有工作,......
但是当我想通过 yield 移动 IEnumerable 并将它们写回集合/文件时,我是否需要使用枚举器概念,或者是否有类似的东西类似于 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();
}
【问题讨论】:
-
你能详细说明你的问题吗?您所说的“转移
IEnumerables”是什么意思?IEnumerable<T>是惰性求值的,这意味着该方法在您开始迭代之前甚至不会开始执行。 -
我的意思是,我想以块或流的形式读取数据,在内存中处理它们并将它们写回。在我读取数据表中的所有数据之前,对它们进行循环、转换值、添加列、删除行……然后他们写回了完整的数据表(xml、数据库、csv……)。但是数据太多(数据表变得太大),我需要将处理(读取、处理、写入)拆分为“块”或使用类似流的东西。