using System.Collections.Generic;
public static void Main()
IList<TimePeriodItineraryRecord> records = new List<TimePeriodItineraryRecord>();
var tp1Id = Guid.NewGuid();
for(var i = 0; i < 3; i++) {
records.Add(new TimePeriodItineraryRecord(tp1Id, "Trimestre 1", 0, Guid.NewGuid(), $"Step {i}", i, $"Style {i}"));
var tp2Id = Guid.NewGuid();
for(var i = 0; i < 3; i++) {
records.Add(new TimePeriodItineraryRecord(tp2Id, "Trimestre 3", 2, Guid.NewGuid(), $"Step {i+3}", i, $"Style {i}"));
var tp3Id = Guid.NewGuid();
for(var i = 0; i < 3; i++) {
records.Add(new TimePeriodItineraryRecord(tp3Id, "Trimestre 2", 1, Guid.NewGuid(), $"Step {i+6}", i, $"Style {i}"));
var tpLookup = records.GroupBy(r => new {r.TimePeriodId, r.TimePeriodTitle, r.TimePeriodOrder}, r => r).OrderBy(r => r.Key.TimePeriodOrder);
foreach(var tp in tpLookup) {
Console.WriteLine("Lookup key: " + tp.Key);
var steps = tp.Select(tp => new Step(tp.StepId, tp.StepTitle, tp.StyleName, tp.StepOrder)).OrderBy(s => s.Order);
var itinerary = new TimePeriodItinerary(tp.Key.TimePeriodTitle, tp.Key.TimePeriodOrder, steps);
Console.WriteLine("Itinerary: " + itinerary);
Console.WriteLine("Steps: ");
foreach(var step in steps) {
public record TimePeriodItineraryRecord(Guid TimePeriodId, string TimePeriodTitle, int TimePeriodOrder,
Guid StepId, string StepTitle, int StepOrder, string StyleName);
public record TimePeriodItinerary
public string TimePeriodTitle { get; }
public int Order { get; }
public IEnumerable<Step> Steps { get; }
public TimePeriodItinerary(string timePeriodTitle, int order, IEnumerable<Step> steps)
TimePeriodTitle = timePeriodTitle;
public Guid StepId { get; }
public string Title { get; }
public string StyleName { get; }
public int Order { get; }
public Step(Guid stepId, string title, string styleName, int order)