【问题标题】:LINQ Method - OptimizationLINQ 方法 - 优化
【发布时间】:2018-02-17 21:36:55
【问题描述】:

我正在读取一个 CSV 文件,将其拆分为列,然后分组到一个新类中。

它看起来很笨拙,只是想知道是否有更简单的方法,例如不先将它们选择到类中:

编辑: 为了澄清我试图让TimesheetHours 按所有其他列分组。

var rowList = csvFile.Rows.Select(row => row.Split(','))
    .Select(cols => new UtilisationRow {
        UploadId = savedUpload.Id,
        FullName = cols[0],
        TimesheetWorkDateMonthYear = Convert.ToDateTime(cols[1]),
        TimesheetTaskJobnumber = cols[2],
        TimesheetWorktype = cols[3],
        TimesheetHours = Convert.ToDouble(cols[4]),
        TimesheetOverhead = cols[5]
    })
    .GroupBy(d => new {
        d.FullName,
        d.TimesheetWorkDateMonthYear,
        d.TimesheetTaskJobnumber,
        d.TimesheetWorktype,
        d.TimesheetOverhead
    })
    .Select(g => new UtilisationRow {
        FullName = g.First().FullName,
        TimesheetWorkDateMonthYear = g.First().TimesheetWorkDateMonthYear,
        TimesheetTaskJobnumber = g.First().TimesheetTaskJobnumber,
        TimesheetWorktype = g.First().TimesheetWorktype,
        TimesheetHours = g.Sum(s => s.TimesheetHours),
        TimesheetOverhead = g.First().TimesheetOverhead
    })
    .ToList();

非常感谢, 李。

【问题讨论】:

  • 我不确定 groupby 和 last select 的目的是什么,您是否要过滤不同的元素?因为有更好的方法来做到这一点。
  • 我正在尝试按所有列分组,并对 TimesheetHours TimesheetHours = g.Sum(s => s.TimesheetHours) 求和
  • 使用 oledb 读入数据表。前几天我举了一个小例子:stackoverflow.com/questions/48788682/…

标签: c# linq csv performance-testing


【解决方案1】:

您的代码中的两个问题是您在一个组上重复调用First(),而您应该从组的键中检索相同的数据,并且您在第一个Select 中使用UtilisationRow,它应该使用改为匿名类型:

var rowList = csvFile.Rows.Select(row => row.Split(','))
    .Select(cols => new {
        UploadId = savedUpload.Id,
        FullName = cols[0],
        TimesheetWorkDateMonthYear = Convert.ToDateTime(cols[1]),
        TimesheetTaskJobnumber = cols[2],
        TimesheetWorktype = cols[3],
        TimesheetHours = Convert.ToDouble(cols[4]),
        TimesheetOverhead = cols[5]
    })
    .GroupBy(d => new {
        d.FullName,
        d.TimesheetWorkDateMonthYear,
        d.TimesheetTaskJobnumber,
        d.TimesheetWorktype,
        d.TimesheetOverhead
    })
    .Select(g => new UtilisationRow {
        FullName = g.Key.FullName,
        TimesheetWorkDateMonthYear = g.Key.TimesheetWorkDateMonthYear,
        TimesheetTaskJobnumber = g.Key.TimesheetTaskJobnumber,
        TimesheetWorktype = g.Key.TimesheetWorktype,
        TimesheetHours = g.Sum(s => s.TimesheetHours),
        TimesheetOverhead = g.Key.TimesheetOverhead
    })
    .ToList();

现在你的方法的“管道”看起来很干净:

  • 第一个 Select 将初始解析为临时记录
  • GroupBy 将匹配的记录捆绑到一个组中
  • 最终的Select 生成所需类型的记录。

【讨论】:

  • 非常感谢!感谢您的解释和帮助我继续学习! :)
猜你喜欢
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2016-03-26
  • 1970-01-01
  • 2019-04-15
相关资源
最近更新 更多