使用CSVHelper映射IEnumerable属性

9
我有一个名为 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属性以实现我想要的结果?

可能是重复的问题:CsvHelper - 将多列读入单个列表 - Marco
1
请参见"问题标题中是否应包含“标签”?",共识是“不应该”! - user57508
3个回答

5

这不是CsvHelper-将多个列读入单个列表的副本,因为该问题询问如何从模型转换为CSV而不是反过来。我通过创建一个中间模型来解决这个问题。因此,首先将原始模型(User)转换为中间模型(Contact),然后映射该模型并创建CSV。


2

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

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 上放置建议的属性。

希望这能帮助到某个人。


1
我喜欢你的解决方案 @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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接