C# 使用CSVHelper映射IEnumerable属性

C# 使用CSVHelper映射IEnumerable属性,c#,csv,ienumerable,csvhelper,C#,Csv,Ienumerable,Csvhelper,我有一个用户类,它可以有多个联系人号码。我正在使用CsvHelper生成一份关于用户的报告,该报告将创建一个包含用户姓名和联系人详细信息的CSV文件每个联系人号码都应显示在自己的列中,列标题为联系人号码的类型。 下面是我的ContactNumber和User类,以及一个UserMap类,该类应相应地格式化我的CSV文件: public class ContactNumber { public string ContactType { get; set; } public stri

我有一个
用户类
,它可以有多个联系人号码。我正在使用CsvHelper生成一份关于用户的报告,该报告将创建一个包含用户姓名和联系人详细信息的CSV文件每个联系人号码都应显示在自己的列中,列标题为联系人号码的类型。

下面是我的
ContactNumber
User
类,以及一个
UserMap
类,该类应相应地格式化我的CSV文件:

public class ContactNumber
{
    public string ContactType { get; set; }
    public string Number { get; set; }
}

public class User
{
    public string Name { get; set; }
    public IEnumerable<ContactNumber> ContactNumbers{ get; set;}
}

public sealed class UserMap : CsvClassMap<User>
{
    public UserMap()
    {
        Map(m => m.Name).Name("Username");
        // Incorrect Code
        Map(m => m.ContactNumbers).Name(c => c.ContactType);
    }
}
公共类联系人号码
{
公共字符串ContactType{get;set;}
公共字符串编号{get;set;}
}
公共类用户
{
公共字符串名称{get;set;}
公共IEnumerable联系人号码{get;set;}
}
公共密封类UserMap:CsvClassMap
{
公共用户映射()
{
Map(m=>m.Name).Name(“用户名”);
//错误代码
Map(m=>m.contactnumber).Name(c=>c.ContactType);
}
}

我应该如何映射ContactNumber的IEnumerable属性以获得我想要的结果?

这不是重复的,因为这个问题询问如何从模型转换为CSV,而不是反过来。我通过创建中间模型解决了这个问题。因此,首先将原始模型(用户)转换为中间模型(联系人),然后映射该模型并创建CSV。

我知道这是一个老问题,但我通过在DTO(用户类)上添加以下属性创建了另一个解决方案

然后我在CsvHelper中映射到此属性,如下所示:

Map(a => a.ConcatenatedUserNumbers).Name("User Numbers");
显然,您可以对用户类型执行相同的操作,或者有一个同时获取这两种类型的方法。数据可能并不完美,但最终用户仍然可以使用excel中的“筛选”功能,并且它将是人类可读的。所有这些都不需要多余的映射等

注意:如果此额外属性仅用于CSV映射,则还可以创建一个类CSVUser:User。您只能将建议的属性放在CSVUser上


我希望这能帮助别人

我喜欢你的解决方案@Humble Rumble

公共字符串串接序号
{
得到
{
if(ContactNumbers!=null&&ContactNumbers.Any())
{
返回string.Join(“;”,ContactNumbers.Select(a=>a.Number));
}
返回字符串。空;
}
}
这是一只羔羊

公共字符串concatenatedUserNumber=>
(this.ContactNumbers!=null&&this.ContactNumbers.Any())
? string.Join(“;”,this.ContactNumbers.Select(a=>a.Number))
:string.Empty;
可能重复的请参见,其中一致意见是“不,他们不应该”!
Map(a => a.ConcatenatedUserNumbers).Name("User Numbers");