要进一步详细说明Josh Close的答案,这里是IEnumerable
在 CsvHelper 的最新版本(任何高于 3.0 的版本)中编写任何(包括数组和通用列表)所需的操作!
这里是被测试的类:
public class Test
{
public int[] Data { get; set; }
public Test()
{
Data = new int[] { 0, 1, 2, 3, 4 };
}
}
以及一种显示如何保存的方法:
static void Main()
{
using (var writer = new StreamWriter("db.csv"))
using (var csv = new CsvWriter(writer))
{
var list = new List<Test>
{
new Test()
};
csv.Configuration.HasHeaderRecord = false;
csv.WriteRecords(list);
writer.Flush();
}
}
这里的重要配置是csv.Configuration.HasHeaderRecord = false;
. 只有使用此配置,您才能看到 csv 文件中的数据。
更多细节可以在CsvHelper的相关单元测试用例中找到。
如果您正在寻找一种解决方案来存储IEnumerable
具有不同数量元素的类型属性,以下示例可能会有所帮助:
using CsvHelper;
using CsvHelper.Configuration;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace CsvHelperSpike
{
class Program
{
static void Main(string[] args)
{
using (var writer = new StreamWriter("db.csv"))
using (var csv = new CsvWriter(writer))
{
csv.Configuration.Delimiter = ";";
var list = new List<AnotherTest>
{
new AnotherTest("Before String") { Tags = new List<string> { "One", "Two", "Three" }, After="After String" },
new AnotherTest("This is still before") {After="after again", Tags=new List<string>{ "Six", "seven","eight", "nine"} }
};
csv.Configuration.RegisterClassMap<TestIndexMap>();
csv.WriteRecords(list);
writer.Flush();
}
using(var reader = new StreamReader("db.csv"))
using(var csv = new CsvReader(reader))
{
csv.Configuration.IncludePrivateMembers = true;
csv.Configuration.RegisterClassMap<TestIndexMap>();
var result = csv.GetRecords<AnotherTest>().ToList();
}
}
private class AnotherTest
{
public string Before { get; private set; }
public string After { get; set; }
public List<string> Tags { get; set; }
public AnotherTest() { }
public AnotherTest(string before)
{
this.Before = before;
}
}
private sealed class TestIndexMap : ClassMap<AnotherTest>
{
public TestIndexMap()
{
Map(m => m.Before).Index(0);
Map(m => m.After).Index(1);
Map(m => m.Tags).Index(2);
}
}
}
}
通过使用,ClassMap
可以再次启用HasHeaderRecord
(默认)。需要注意的是,这个解决方案只有在元素数量不同的集合是最后一个属性时才有效。否则,集合需要具有固定数量的元素,并且ClassMap
需要相应地进行调整。
此示例还展示了如何使用private set
. 为此,使用csv.Configuration.IncludePrivateMembers = true;
配置并在您的类上使用默认构造函数非常重要。