我正在将一个非常大的代码库从 CsvHelper V15.0.5 升级到 V30.0.1。
现有的代码库相当复杂,但是有一个基本相当于这个的功能:
async Task<string> WriteRecords(IEnumerable rows, Type t)
{
using (var s = new MemoryStream())
{
using (var w = new CsvWriter(new StreamWriter(s), CultureInfo.CurrentCulture, true))
{
w.WriteHeader(t);
await w.NextRecordAsync();
await w.WriteRecordsAsync(rows);
}
return Encoding.UTF8.GetString(s.GetBuffer());
}
}
可以使用设置为可能有 0、1 或数百万行的枚举的行来调用该函数。如果有的话,该函数应该写入行,如果没有,则只写入标题记录。它做得很好,但是升级后,如果枚举器中有任何行,它会将标题行写入两次。
我尝试删除对
WriteHeader(t)
的调用,但是当 rows 参数是空枚举时,标题不会写出。
有没有办法让
WriteRecordsAsync
永远不写出标题行,或者有没有办法让它在行为空时写出标题行?
我似乎无法将
w.Configuration.HasHeaderRow
设置为 false
,因为它是只读的。我也无法真正在可能传递给此方法的所有类上设置属性,因为我并没有真正控制应用程序的这一部分。
我知道我可以做到
if (rows.Any()) ...
,但出于性能原因,我不想将其枚举两次。
用
CsvConfiguration
传递 HasHeaderRecord = false
似乎有效。
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false,
LeaveOpen = true
};
using (var w = new CsvWriter(new StreamWriter(s), config))
从版本 30.0.0 开始,
CsvWriter
似乎会忽略 HasHeaderRecord = false
配置。
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
HasHeaderRecord = false
};
using (var w = new CsvWriter(new StreamWriter(s), config, true))