使用CSVHelper映射IEnumerable属性

问题描述 投票:8回答:3

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

下面我有我的ContactNumberUser类,以及应该格式化我的CSV文件的UserMap类:

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);
    }
}

我应该如何映射ContactNumbers的IEnumerable属性以实现我想要的结果?

c# csv ienumerable csvhelper
3个回答
4
投票

它不是CsvHelper - read in multiple columns to a single list的副本,因为这个问题询问如何从模型转换为CSV而不是相反。我通过创建一个中间模型解决了这个问题。因此,首先将原始模型(用户)转换为模型(联系人)之间,然后映射该模型并创建CSV。


1
投票

我知道这是一个老问题,但我通过在我的DTO(User类)上放置以下属性创建了另一个解决方案。

public string ConcatenatedUserNumbers
    {
        get
        {
            if (ContactNumbers != null && ContactNumbers.Any())
            {
                return string.Join("; ", ContactNumbers.Select(a => a.Number));
            }
            return string.Empty;
        }
    }

然后我只是在CsvHelper中映射到这个属性,如下所示:

Map(a => a.ConcatenatedUserNumbers).Name("User Numbers");

显然,您可以对用户类型执行相同操作,或者使用同时获取这两者的方法。数据可能不完美,但最终用户仍然可以使用excel中的“过滤器”功能,它将是人类可读的。所有这些都不需要多余的映射等。

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

我希望这可以帮助别人。


0
投票

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

public string ConcatenatedUserNumbers
    {
        get
        {
            if (ContactNumbers != null && ContactNumbers.Any())
            {
                return string.Join("; ", ContactNumbers.Select(a => a.Number));
            }
            return string.Empty;
        }
    }

这是一个lambda

    public string ConcatenatedUserNumbers =>
        (this.ContactNumbers != null && this.ContactNumbers .Any())
        ? string.Join("; ", this.ContactNumbers .Select(a => a.Number))
        : string.Empty;
© www.soinside.com 2019 - 2024. All rights reserved.