csv 更改列的顺序

csv change order of the columns

我目前正在使用 ServiceStack.Text 从对象列表中序列化 CSV。 我有一个模型:

public class UploadDocument
{

[DataMember(Name = "Patient")]
public string Patient { get; set; }

[DataMember(Name = "Patient First Name")]
public string PatientFirstName { get; set; }

[DataMember(Name = "Patient Last Name")]
public string PatientLastName { get; set; }

[DataMember(Name = "Email")]
public string Email { get; set; }

}

结果是:

Patient,    Patient First Name, Patient Last Name,  Email
XXX,        YYY,                ZZZZZ,              nwerwer@yahoo.com,    
XXX,        YYY,                ZZZZZ,              nwerwerwe@yahoo.com,    
XXX,        YYY,                ZZZZZ,              nwerwe@yahoo.com,   

但是,对于另一份报告,我需要更改 csv 和 return:

的顺序
Email,               Patient,    Patient First Name, Patient Last Name,  
nwerwer@yahoo.com,   XXX,        YYY,                ZZZZZ,                  
nwerwerwe@yahoo.com, XXX,        YYY,                ZZZZZ,                  
nwerwe@yahoo.com,    XXX,        YYY,                ZZZZZ, 

有没有办法避免创建新模型?

您可以使用订单选项。 前任: [DataMember(订单 = 0)]

文档位于 link: https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/data-member-order

CustomHeaderTests.cs 中有一些设置自定义 Headers 的示例,您可以在其中覆盖序列化的 CSV Headers。注意:这是静态配置,应该在启动时初始化一次,因为它不是线程安全的,无法在运行时进行变异。

但我个人会定义一个单独的模型,其中包含您想要的 headers 的顺序和数量,您不应该将其视为重复代码,您在每个 [= 中以声明方式定义您想要的结构23=] 比在运行时修改序列化实现更易于维护。

要在模型之间进行映射,您可以使用 ServiceStack 的 AutoMapping Utils,例如:

var report2 = report1.ConvertTo<List<Report2Document>>();

另一种避免定义模型的解决方案是 convert the model to an Object Dictionary,按照您想要的顺序将每个字典转换为 List<KeyValuePair<string,string>> 并序列化它。