C# LINQ方法-优化

C# LINQ方法-优化,c#,linq,csv,performance-testing,C#,Linq,Csv,Performance Testing,我正在读取一个CSV文件,将其拆分为col,然后分组为一个新类 它看起来很笨拙,只是想知道是否有一个更简单的方法,例如,不首先将它们选择到类中: 编辑:为了澄清这一点,我试图将时间表按所有其他列进行分组 var rowList = csvFile.Rows.Select(row => row.Split(',')) .Select(cols => new UtilisationRow { UploadId = savedUpload.Id, F

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

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

编辑:为了澄清这一点,我试图将
时间表
按所有其他列进行分组

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();
非常感谢,,
Lee。

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

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
    生成所需类型的记录

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

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
    生成所需类型的记录

我不确定groupby和last select的目的是什么,您是否尝试过滤不同的元素?因为有更好的方法可以做到这一点。我正在尝试按所有列进行分组,并对时间表进行求和
TimesheetHours=g.sum(s=>s.TimesheetHours)
使用oledb读取数据表。前几天我举了一个小例子:我不确定groupby和last select的目的是什么,您是否在尝试过滤不同的元素?因为有更好的方法可以做到这一点。我正在尝试按所有列进行分组,并对时间表进行求和
TimesheetHours=g.sum(s=>s.TimesheetHours)
使用oledb读取数据表。前几天我举了一个小例子:非常感谢!感谢您的解释并帮助我继续学习!:)非常感谢!感谢您的解释并帮助我继续学习!:)