void WriteLegLoadSection(EventDB eventDB)
{
// Maps legs to load infos, so we only process each leg once.
Dictionary<Pair<Id<ControlPoint>, Id<ControlPoint>>, LegLoadInfo> loadInfos = new Dictionary<Pair<Id<ControlPoint>, Id<ControlPoint>>, LegLoadInfo>();
// Get load information about each leg. To enumerate all legs, just enumerate all courses and all legs on each course.
foreach (Id<Course> courseId in eventDB.AllCourseIds) {
foreach (QueryEvent.LegInfo leg in QueryEvent.EnumLegs(eventDB, new CourseDesignator(courseId))) {
Id<ControlPoint> controlId1 = eventDB.GetCourseControl(leg.courseControlId1).control;
Id<ControlPoint> controlId2 = eventDB.GetCourseControl(leg.courseControlId2).control;
Pair<Id<ControlPoint>, Id<ControlPoint>> key = new Pair<Id<ControlPoint>, Id<ControlPoint>>(controlId1, controlId2);
if (!loadInfos.ContainsKey(key)) {
// This leg hasn't been processed yet. Process it.
LegLoadInfo loadInfo = new LegLoadInfo();
loadInfo.controlId1 = controlId1;
loadInfo.controlId2 = controlId2;
loadInfo.text = string.Format("{0}\u2013{1}", Util.ControlPointName(eventDB, controlId1, NameStyle.Medium), Util.ControlPointName(eventDB, controlId2, NameStyle.Medium));
loadInfo.numCourses = QueryEvent.CoursesUsingLeg(eventDB, controlId1, controlId2).Length;
loadInfo.load = QueryEvent.GetLegLoad(eventDB, controlId1, controlId2);
loadInfos.Add(key, loadInfo);
}
}
}
// Remove legs used only once.
List<LegLoadInfo> loadInfoList = new List<LegLoadInfo>(loadInfos.Values);
loadInfoList = loadInfoList.FindAll(delegate(LegLoadInfo loadInfo) { return loadInfo.numCourses > 1; });
// Sort the list of legs, first by load, then by number of courses
loadInfoList.Sort(delegate(LegLoadInfo loadInfo1, LegLoadInfo loadInfo2) {
if (loadInfo1.load < loadInfo2.load) return 1;
else if (loadInfo1.load > loadInfo2.load) return -1;
if (loadInfo1.numCourses < loadInfo2.numCourses) return 1;
else if (loadInfo1.numCourses > loadInfo2.numCourses) return -1;
return 0;
});
// Write the table.
WritePara(ReportText.Load_OnlyLegsMoreThanOnce);
BeginTable("", 3, "leftalign", "rightalign", "rightalign");
WriteTableHeaderRow(ReportText.ColumnHeader_Leg, ReportText.ColumnHeader_NumberOfCourses, ReportText.ColumnHeader_Load);
foreach (LegLoadInfo loadInfo in loadInfoList) {
WriteTableRow(loadInfo.text,
Convert.ToString(loadInfo.numCourses),
loadInfo.load >= 0 ? Convert.ToString(loadInfo.load) : "");
}
EndTable();
}