【问题标题】:Mapping an IEnumerable property with CSVHelper使用 CSVHelper 映射 IEnumerable 属性
【发布时间】:2015-06-16 08:49:36
【问题描述】:

我有一个班级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


【解决方案1】:

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

    我希望这可以帮助某人。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-12
        • 2020-11-16
        • 1970-01-01
        相关资源
        最近更新 更多