我需要处理一个大文件,大约400K行和200M.但有时我必须自下而上处理.我怎样才能在这里使用迭代器(yield return)?基本上我不喜欢在内存中加载所有内容.我知道在.NET中使用迭代器更有效.
这比我想象的要复杂一些.我正在尝试从流中读取n个字节.
在MSDN声称,上面写着不必返回n个字节,它只是必须返回至少1和n个字节,以0字节是到达流的末尾的特殊情况.
通常,我正在使用类似的东西
var buf = new byte[size];
var count = stream.Read (buf, 0, size);
if (count != size) {
buf = buf.Take (count).ToArray ();
}
yield return buf;
Run Code Online (Sandbox Code Playgroud)
我希望确切的size字节,但通过规范FileStream也将允许返回大量的1字节块.必须避免这种情况.
解决这个问题的一种方法是使用2个缓冲区,一个用于读取,一个用于收集块,直到我们获得所请求的字节数.虽然这有点麻烦.
我也看了一下BinaryReader但它的规范也没有明确说明肯定会返回n个字节.
澄清一下:当然,在流结束时,返回的字节数可能小于size- 这不是问题.我只是谈论不接收n个字节,即使它们在流中可用.