【问题标题】:How to update object values (based on the curr-previous pattern)?如何更新对象值(基于 curr-previous 模式)?
【发布时间】:2010-10-18 07:51:16
【问题描述】:

假设您有一个具有以下简化结构的 CSV 文件

 LINE1:  ID,Description,Value
 LINE2:  1,Product1,2
 LINE3:  ,,3
 LINE4:  ,,4
 LINE5:  2,Product2,2
 LINE6:  ,,3
 LINE7:  ,,5 

我正在使用 FileHelpers 读取 CSV,并连接了一个接口,允许我在读取当前行后访问它。有关更多背景信息,请参阅此SO question

问题在于,使用这种方法我需要编写更多 if 语句来检查所有需要复制的字段。 (我目前至少有 6 个具有相同“空白”格式的 csv 文件,它们都有 20 多个需要复制的字段 ~ 120 if 语句。urggh)

现在这不是一个微优化练习,因为会有更多的文件具有这种“不完整”的格式。

如何以优雅的方式更新之前的记录,这样我就不必为每个字段编写 if 条件和声明?

【问题讨论】:

  • 有一个需要复制的字段列表,并为列表中的每个字段执行您所做的操作。除非 FH 提供一种以文本方式访问字段的方法,否则您必须使用反射。
  • @jaroslav - 见下文......这是否与您所指的内容一致。
  • 这是一种方法。不过,我会缓存结果,因此您不必每次读取记录时都生成字段列表(将列表保存在内部集合中)。
  • @jaroslav - 好主意,静态收集有用吗?
  • 当然,只要确保它是线程安全的,因为您可以在同一个应用程序域中读取多个 CSV。您也可以将其缓存在您从 CSV 解析出来的类的静态构造函数中,然后使用 Product.GetCopyFields() 方法或您命名它来请求字段列表。

标签: c# .net csv


【解决方案1】:

目前的解决方案是使用名为CopyMe的自定义属性对必填字段进行注释,然后使用反射进行复制。

[DelimitedRecord(",") ]
[IgnoreFirst(1)] 
public class Product
{

    [CopyMe()] public int ID { get; set; }
    [CopyMe()] public string Description { get; set; }

    [FieldConverter(ConverterKind.Decimal)]
    public decimal Val{ get; set; }
}

AfterRead 方法看起来像这样......

public void AfterRead(AfterReadEventArgs<RawVolsDataPoints> e)
{
    var record = (Product)e.Record;

    if (PreviousRecord == null)
    {
        PreviousRecord = new Product();
         PreviousRecord = record;
    }

    if (String.IsNullOrEmpty(record.ID)) // null value indicates a new row
    {
        var ttype = typeof(Product);
        var fields = ttype.GetFields();

        var fieldsToCopy = fields.Where(field =>
            field.GetCustomAttributes(typeof(CopyMeAttribute), true).Any());

        foreach (var item in fieldsToCopy)
        {
            var prevvalue = item.GetValue(PreviousRecord);
            item.SetValue(record, prevvalue);
         }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2021-05-14
    • 2019-02-21
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多