【发布时间】:2011-03-29 20:08:32
【问题描述】:
我正在调用具有多个结果集(始终为 2 个)的存储过程,并将结果写入单独的文件(以管道分隔格式)。我无法将结果集拆分为单独的存储过程。我正在使用 IDataReader 和 IEnumerable 在此过程中保留尽可能少的内存。
有没有比使用 GetEnumerator/MoveNext/Current 获取内部 IEnumerable<string> 以传递给 File.AppendAllLines 更清洁的方式来使用我的 IEnumerable<IEnumerable<string>>?
public void Execute()
{
var reader = GetLines();
using (var enumerator = reader.GetEnumerator())
{
enumerator.MoveNext();
File.AppendAllLines("file1.dat", enumerator.Current);
enumerator.MoveNext();
File.AppendAllLines("file2.dat", enumerator.Current);
}
}
public IEnumerable<IEnumerable<string>> GetLines()
{
Database db = DatabaseFactory.CreateDatabase("connectionStringKey");
using (var command = db.GetStoredProcCommand("getdata_sp"))
{
var reader = db.ExecuteReader(command);
yield return GetInnerEnumerable(reader);
reader.NextResult();
yield return GetInnerEnumerable(reader);
}
}
private IEnumerable<string> GetInnerEnumerable(IDataReader reader)
{
while (reader.Read())
{
object[] rowValues = new object[reader.FieldCount];
reader.GetValues(rowValues);
yield return String.Join("|", rowValues);
}
}
【问题讨论】:
-
也许我并不清楚命名方法 GetLines() ——它返回 IEnumerable
>。应该叫它GetReaders()
标签: c# ienumerable coding-style