C# 在CsvHelper中使用应报价的问题

C# 在CsvHelper中使用应报价的问题,c#,quote,csvhelper,C#,Quote,Csvhelper,我在使用csvHelper库时遇到了一些问题。我已经附加了我的类对象。我希望字符串和日期时间类型的数据将只引用 我知道我需要更新csv.Configuration.ShouldQuote选项。但我不知道怎么做 static void Main() { var recordNew = new List<Metadata> { new Metadata { Id = Guid.

我在使用csvHelper库时遇到了一些问题。我已经附加了我的类对象。我希望字符串和日期时间类型的数据将只引用

我知道我需要更新csv.Configuration.ShouldQuote选项。但我不知道怎么做

static void Main()
        {      
            var recordNew = new List<Metadata>
             {
                 new Metadata { Id = Guid.NewGuid(), VersionNumber = 100, CreatedOn=DateTime.Now, Name = "two", AccountSequene=90, IsPublic=false}
             };

            writeDataTest(recordNew);

        }

        private static void writeDataTest(List<Metadata> records)
        {
            using (var writer = new StringWriter())
            using (var csv = new CsvWriter(writer))
            {
               csv.Configuration.HasHeaderRecord = false;
               csv.Configuration.ShouldQuote = (field, context) =>
               {
                    return context.Record.Count == 1;
                };
               csv.Configuration.RegisterClassMap<MetadataMap>();
               csv.WriteRecords(records);
               var s = writer.ToString();

            }
        }


        public class Metadata
        {
            public Guid? Id { get; set; }
            public long? VersionNumber { get; set; }
            public DateTime? CreatedOn { get; set; }
            public string Name { get; set; }
            public string Email { get; set; }
            public long? AccountSequene { get; set; }
            public bool? IsPublic { get; set; }
        }
        public class MetadataMap : ClassMap<Metadata>
        {
            public MetadataMap()
            {
                Map(m => m.Id).Index(0);
                Map(m => m.VersionNumber).Index(1);
                Map(m => m.CreatedOn).Index(2).ConvertUsing(m => $"\"{m.CreatedOn}\"");
                Map(m => m.Name).Index(3).ConvertUsing(m => $"\"{m.Name}\"");
                Map(m => m.Email).Index(4).ConvertUsing(m => $"\"{m.Email}\"");
                Map(m => m.AccountSequene).Index(5);
                Map(m => m.IsPublic).Index(6);
            }
        }
static void Main()
{      
var recordNew=新列表
{
新元数据{Id=Guid.NewGuid(),VersionNumber=100,CreatedOn=DateTime.Now,Name=“two”,AccountSequene=90,IsPublic=false}
};
书面状态(记录新);
}
私有静态void writeDateTest(列出记录)
{
使用(var writer=new StringWriter())
使用(var csv=新csv编写器(编写器))
{
csv.Configuration.HasHeaderRecord=false;
csv.Configuration.ShouldQuote=(字段,上下文)=>
{
返回context.Record.Count==1;
};
csv.Configuration.RegisterClassMap();
csv.书面记录(记录);
var s=writer.ToString();
}
}
公共类元数据
{
公共Guid?Id{get;set;}
公共长版本?版本号{get;set;}
公共日期时间?CreatedOn{get;set;}
公共字符串名称{get;set;}
公共字符串电子邮件{get;set;}
公共长?AccountSequene{get;set;}
公共bool?IsPublic{get;set;}
}
公共类MetadataMap:ClassMap
{
公共元数据映射()
{
Map(m=>m.Id).Index(0);
Map(m=>m.VersionNumber).Index(1);
Map(m=>m.CreatedOn).Index(2).ConvertUsing(m=>$“\”{m.CreatedOn}\”);
Map(m=>m.Name).Index(3).ConvertUsing(m=>$“\{m.Name}\”);
Map(m=>m.Email).Index(4).ConvertUsing(m=>$“\”{m.Email}\”);
Map(m=>m.AccountSequene)指数(5);
地图(m=>m.IsPublic)。指数(6);
}
}
目前我得到的结果如下

74d5c276-0e5f-442b-a392-cd8fb37c4114,“100”,“2019年12月4日下午2:11:40”,“两个”,“90”,假

100被引用为I set return context.Record.Count==1;但我的预期结果是

74d5c276-0e5f-442b-a392-CD8FB37C4114100,“2019年4月12日下午2:11:40”,“两个”,90,假


在预期结果中,由于未提供字符串电子邮件,因此我希望类似(“两个”、“90”而不是“两个”、“90”)

更新代码如下:

`private static void writeDataTest(List<Metadata> records)
    {
             ......
           csv.Configuration.ShouldQuote = (field, context) =>
           {
                return false;
           };
           ......
     } 

     public class MetadataMap : ClassMap<Metadata>
    { .....
         Map(m => m.Email).Index(4).ConvertUsing(m => m.Email != null ? $"\"{m.Email}\"" : $"{m.Email}"); 
    ....} 
`private static void writeDataTest(列出记录)
{
......
csv.Configuration.ShouldQuote=(字段,上下文)=>
{
返回false;
};
......
} 
公共类MetadataMap:ClassMap
{ .....
Map(m=>m.Email).Index(4).ConvertUsing(m=>m.Email!=null?$“\”{m.Email}\:$”{m.Email}”);
....} 

`您的答案可能更容易阅读,但只是为了防止您想使用
应该引用
。我找到了Josh Close展示的地方。删除类映射中的
ConvertUsing()
语句,然后像这样设置
ShouldQuote

var索引=new[]{2,3,4};
csv.Configuration.ShouldQuote=(字段,上下文)=>index.Contains(context.Record.Count)&&!string.IsNullOrEmpty(字段);

谢谢,大卫。这个解决方案肯定比我的好。