liujunjieonline 2024-02-29 08:25 采纳率: 62.5%
浏览 4
已结题

list datatable遍历循环

img

orderList 为数据库里三个月的订单数据,excel导入再转成datatable,根据datatable的快递号,再去orderList 里比对,快递号存在的话,取出店铺名,在赋值到datatable里的owner字段,发现运行好慢,七千多条数据要五分多钟,给个优化的意见呗

  • 写回答

3条回答 默认 最新

  • 关注

    liujunjieonline 上午好☀️☀️☀️️
    本答案参考通义千问

    您提到的问题是关于遍历大数据量的DataTable并在其中查找匹配项时性能不佳。针对这个问题,以下是一些优化建议:

    1. 数据预处理和缓存

      • orderList进行排序或创建索引,以便快速查找快递号。
      • 如果可能,将频繁查询结果缓存起来,避免重复查询数据库。
    2. 使用LINQ查询优化

      • 使用IntersectExcept方法来找到快递号在dt中但不在orderList中的行,而不是每次单独查询。
    var existingTrackNums = dt.AsEnumerable()
        .Select(row => row.Field<string>("Express or Ground Tracking ID"))
        .ToList();
    
    var unmatchedOrders = orderList.Where(order => !existingTrackNums.Contains(order.TrackNo));
    
    1. 减少IO操作
      • 在写入新的Excel文件之前,确保所有需要的Owner值已经计算出来。
      • 将多个写入操作合并到一个文件操作中,减少文件系统I/O次数。
    string[] owners = new List<string>();
    foreach (DataRow row in dt.Rows)
    {
        // ... 找到owner后,添加到owners列表
    }
    
    // 在这里一次性写入所有owner到新的Excel文件
    using (FileStream fileStream = File.OpenWrite(directoryPath + "MatchOwnByTrackNum.xls"))
    {
        // ... 将owners转换为byte[],然后写入
    }
    
    1. 异步处理

      • 如果操作允许,可以考虑使用异步编程模型(如Taskasync/await)来提高并发处理能力。
    2. 内存管理

      • 避免在循环中创建大量临时字符串,例如使用StringBuilder替换string.Concat()
    3. 数据库连接池

      • 如果使用的是数据库驱动,确保数据库连接池有效利用,避免频繁打开和关闭连接。

    通过以上优化,应该能显著提升代码的执行速度。不过,具体的优化效果取决于数据集大小、硬件配置以及数据库查询性能等因素。如果性能问题依然严重,可能需要进一步分析SQL查询性能或者考虑使用更高效的数据结构。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月19日
  • 已采纳回答 3月11日
  • 创建了问题 2月29日

悬赏问题

  • ¥15 SQLServer怎么录入下标
  • ¥100 无网格伽辽金方法研究裂纹扩展的程序
  • ¥15 如何用数码管显示学号(相关搜索:单片机)
  • ¥15 错误于library(org.Hs.eg.db): 不存在叫‘org.Hs.eg.db’这个名称的程序包,如何解决?
  • ¥60 求一个图片处理程序,要求将图像大小跟现实生活中的大小按比例联系起来的
  • ¥50 求一位精通京东相关开发的专家
  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'