C# LINQ方法-优化
我正在读取一个CSV文件,将其拆分为col,然后分组为一个新类 它看起来很笨拙,只是想知道是否有一个更简单的方法,例如,不首先将它们选择到类中: 编辑:为了澄清这一点,我试图将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
时间表
按所有其他列进行分组
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读取数据表。前几天我举了一个小例子:非常感谢!感谢您的解释并帮助我继续学习!:)非常感谢!感谢您的解释并帮助我继续学习!:)