【发布时间】:2011-09-29 04:44:58
【问题描述】:
我有几个列表需要遍历才能执行计算。总之,List1 是道路起点和终点 (id) 的列表,而 List2 是这些终点的单个速度样本列表(每组终点有多个速度样本)。 List1 是这样定义的:
class RoadwaySegment
{
public int StartId {get; set;}
public int EndId {get; set;}
}
List2 是这样定义的:
class IndividualSpeeds
{
public int StartHour {get; set;}
public int StartMin {get; set;} //either 0,15,30,or 45
public int Speed {get; set;}
public int StartId {get; set;}
public int EndId {get; set;}
}
List3 是我计算的结果,它将包含 List1 中道路段在一天中每 15 分钟的平均速度。 List3 看起来像这样:
class SummaryData
{
public string SummaryHour {get; set;}
public string SummaryMin {get; set;}
public int StartId {get; set;}
public int EndId {get; set;}
public int AvgSpeed {get; set;}
}
目前,要生成 List3,我会遍历 List1,然后遍历一天中的每个 24 小时时段,然后遍历一个小时的每 15 分钟间隔。对于这些迭代中的每一个,我都会检查 List2 中的单个速度样本是否应包含在我的道路路段的平均速度计算中。所以,它看起来像这样:
var summaryList = new List<SummaryData>();
foreach (var segment in RoadwaySegments)
{
for(int startHour = 0; startHour < 24; startHour++)
{
for(int startMin = 0; startMin < 60; startMin+= 15)
{
int totalSpeeds = 0;
int numSamples = 0;
int avgSpeed = 0;
foreach(var speedSample in IndividualSpeeds)
{
if((segment.StartId == speedSample.StartId)&&(segment.EndId == speedSample.EndId)&&(speedSample.StartHour == startHour)&&(speedSample.StartMin == startMin))
{
if(speedSample.Speed > 0)
{
totalSpeeds += speedSample.Speed;
numSamples += 1;
}
}
}
SummaryData summaryItem = new SummaryData {SummaryHour = startHour, SummaryMin = startMin, StartId = segment.StartId, EndId = segment.EndId, AvgSpeed = totalSpeeds/numSamples;
summaryList.Add(summaryItem);
}
}
}
此代码的问题是 List1 可能有一百个路段,但 List2 可以包含一百万或更多的速度样本记录,因此列表的子迭代非常耗时。有没有办法使用 GroupBy/LINQ 来提高这段代码的性能和可读性?注意在平均值中包含速度的条件——它必须大于 0。
【问题讨论】:
标签: c# performance linq