我正在实现一个导入功能,其中我需要从用户上传的 CSV 或 Excel 文件中读取数据并运行一些验证并清理数据,然后再将数据写入数据库。
我可以将文件中的数据获取到对象列表中,其结构如下:
public class Order
{
public string Sku { get; set; }
public decimal Cost { get; set; }
public DateTime OrderFulfillmentStartDate { get; set; }
public DateTime OrderFulfillmentEndDate { get; set; }
public string ValidationErrors{ get; set; }
}
以下是需要在列表中的对象中进行的验证,以下是一些示例:
- 不允许有两个具有相同 SKU 和 OrderFulfillmentStartDate、OrderFulfillmentEndDate 的订单。
- 不允许有两个具有相同 SKU 且 OrderFulfillmentStartDate、OrderFulfillmentEndDate 重叠的订单。
等等
我实现它的方式:
- 在第一次遇到不同记录期间(通过所有验证和“ValidationErrors”== string.empty),我将记录添加到临时列表中。
- 在下一次迭代中,我正在使用临时列表中的记录验证当前正在处理的记录,如果验证失败,我将填充“ValidationErrors”字段并添加临时列表。
例如:
现在来到问题的症结所在: 数据的大小可能在 100 万行左右。
当我使用 foreach 循环按顺序实施验证时,验证过程需要 8 个多小时。话虽如此,我相信并行进行验证将大大减少所需的时间。
我确实尝试使用Parallel.ForEach和Partitioner概念来实现逻辑。处理确实加快了,但我不确定如何在验证期间保留一个可由 ForEach 循环中的多个线程使用/更新的临时列表。
有没有更好或更快的方法来实现我在这里尝试做的事情?请务必让我知道。
谢谢你!