如何使用 CsvHelper 将 IList<T> 写入 csv 文件?

How to write IList<T> to csv file using CsvHelper?

我刚开始使用 Josh Close 的 CsvHelper 组件。但是我还没有完全理解映射的概念。我有一个 class Order 看起来像这样:

public class Order
{
  public int Id { get; set; }

  public IList<Address> Addresses { get; set; }
}

其中 Address 看起来像这样:

public class Address
{
  public string Name { get; set; }

  public string City { get; set; }
}

现在我想将这些 classes 写入 csv 文件。样本输出可能是这样的:

Order.Id;Order.Address.Name;Order.Address.City
1;"Bob Miller";"London"

我有两个映射 classes OrderMapAddressMap:

public sealed class OrderMap : CsvClassMap<Order>
{
  public OrderMap ()
  {
    Map (m => m.Id);
    Map (m => m.Addresses).Index (0);
  }
}

public sealed class AddressMap : CsvClassMap<Address>
{
  public AddressMap ()
  {
    Map (m => m.Name);
    Map (m => m.City);
  }
}

但这会产生以下输出:

Id,Addresses
1,CsvHelperClassMappingTest.Address

那么,我在这里缺少什么?

据我所知,CsvClassMaps 仅用于阅读,不用于写作。要获得您正在寻找的输出,您只需将复杂的 Order 对象映射到与 CSV 中所需布局相匹配的平面对象。像这样定义你的 class:

class FlatOrder
{
    public FlatOrder(Order order)
    {
        Id = order.Id;
        var firstAddress = order.Address[0];
        AddressName = firstAddress.Name;
        AddressCity = firstAddress.City;
    }

    public int Id { get; set; }

    public string AddressName { get; set; }

    public string AddressCity { get; set; }
}

然后映射并写入您的对象:

var flatOrders = orders.Select(o => new FlatOrder(o));
csv.WriteRecords(flatOrders);

如果你觉得懒惰,你甚至可以使用匿名类型而不是预先定义一个。