【发布时间】:2021-09-25 09:26:06
【问题描述】:
我写了下面的代码,它有效:
//VERSION 1;
static IEnumerable<string> ReadAsLines(string filename)
{
using (StreamReader reader = new StreamReader(filename))
{
while (!reader.EndOfStream)
yield return reader.ReadLine();
}
}
使用上述方法:
const string fileData = @"path\to\somePipeDelimitedData.txt";
var reader = ReadAsLines(fileData);
var headerArr = reader.First().Split('|');
foreach (var column in headerArr)
{
var dummy = column;
}
var recordsEnumerable = reader.Skip(1); //skip first header Line
//Read other lines...
foreach (var record in recordsEnumerable)
{
//read each line
var rowArray = record.Split('|');
//etc...
}
现在假设我从 Stream 而不是文件开始; 我尝试重写上面的代码,但我正在努力关闭流。 如何修复以下版本?
//VERSION 2;
static IEnumerable<string> ReadAsLines(Stream stream)
{
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
yield return reader.ReadLine();
}
}
调用版本 2:
byte[] dataByteArr = File.ReadAllBytes(fileData);
MemoryStream memStr = new MemoryStream(dataByteArr);
var reader2 = ReadAsLines(memStr);
var headerArr2 = reader2.First().Split('|'); //*** STREAM gets closed after this line
foreach (var column in headerArr2)
{
var dummy = column;
}
var recordsEnumerable2 = reader2.Skip(1); //skip first header Line
//Read other lines... *** ERROR OCCURS HERE, as the Stream is closed.
foreach (var record in recordsEnumerable2)
{
//read each line
var rowArray = record.Split('|');
//etc...
}
【问题讨论】:
-
@Progman 这不是这个问题的重复...He is asking why
reader2.First()is causing dispose -
@Selvin 没错,我知道流即将关闭,我的问题是为什么,以及如何使用 yield 关键字重新组织我的示例,以便它可以与 Stream 一起使用。
-
“我的问题是为什么” - 这不会出现在您的问题中的任何地方。这是因为您正在调用
reader2.First(),它将释放为调用它的枚举创建的迭代器。 -
你可以尝试只迭代一次......如果它是第一行,则标记指向它
-
感谢大家对我找到解决方案的提示。
标签: c# ienumerable yield-return