Если вы хотите выполнить агрегацию, вы можете использовать ConvertUsing
. https://joshclose.github.io/CsvHelper/examples/configuration/class-maps/inline-type-conversion
Функция передает значение IReaderRow
, и вам необходимо вернуть значение, которое установлено для свойства. Поскольку у вас есть строка, вы можете извлечь из любого поля все, что захотите, и создать значение, которое будет установлено.
Пример:
void Main()
{
var s = new StringBuilder();
s.AppendLine("Id,A,B");
s.AppendLine("1,2,3");
using (var reader = new StringReader(s.ToString()))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
csv.Configuration.RegisterClassMap<FooMap>();
csv.GetRecords<Foo>().ToList().Dump();
}
}
public class Foo
{
public int Id { get; set; }
public int Sum { get; set; }
}
public class FooMap : ClassMap<Foo>
{
public FooMap()
{
Map(m => m.Id);
Map(m => m.Sum).ConvertUsing(row => row.GetField<int>("A") + row.GetField<int>("B"));
}
}
Если вы хотите, чтобы все остальные поля были помещены в List
или что-то подобное, вы можете сделать это.
void Main()
{
var s = new StringBuilder();
s.AppendLine("Id,A,B");
s.AppendLine("1,2,3");
using (var reader = new StringReader(s.ToString()))
using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
{
csv.Configuration.RegisterClassMap<FooMap>();
csv.GetRecords<Foo>().ToList().Dump();
}
}
public class Foo
{
public int Id { get; set; }
public List<int> TheRest { get; set; }
}
public class FooMap : ClassMap<Foo>
{
public FooMap()
{
Map(m => m.Id);
Map(m => m.TheRest).Index(1);
}
}
Вы также можете указать конечный индекс.