У меня есть несколько списков, которые мне нужно перебрать, чтобы выполнить вычисление. Таким образом, List1 - это список начальных и конечных точек дороги (идентификаторов), а List2 - это список отдельных выборок скорости для этих конечных точек (для каждого набора конечных точек имеется несколько выборок скорости). Список1 определяется следующим образом:
class RoadwaySegment
{
public int StartId {get; set;}
public int EndId {get; set;}
}
Список 2 определяется следующим образом:
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.