LINQ 方法 - 优化

LINQ Method - Optimization

我正在读取 CSV 文件,将其拆分为 cols,然后分组为新的 class。

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

编辑: 为了澄清,我试图让 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();

非常感谢, 李.

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

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();

现在你的方法 "pipeline" 看起来很干净:

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