using System.Collections.Generic;
public static void Main()
creationDate = new DateTime(2020, 1, 1),
creationDate = new DateTime(2020, 2, 1),
creationDate = new DateTime(2020, 3, 1),
creationDate = new DateTime(2020, 4, 1),
var last = managers.Last();
var managersWithDateTo = managers.Skip(2).Aggregate(
list = new [] { new { sponsor = managers[0].sponsor, pm = managers[0].pm, dateFrom = managers[0].creationDate, dateTo = managers[1].creationDate }}.ToList(),
acc.list.Add(new {sponsor = acc.prev.sponsor, pm = acc.prev.pm, dateFrom = acc.prev.creationDate, dateTo = curr.creationDate });
).list.Concat(new [] { new {
dateFrom = last.creationDate,
dateTo = DateTime.MinValue
var roles = managersWithDateTo.Select(x => new [] {
new {roleName = "sponsor", resourceName = x.sponsor, dateFrom = x.dateFrom, dateTo = x.dateTo},
new {roleName = "pm", resourceName = x.pm, dateFrom = x.dateFrom, dateTo = x.dateTo }
}).SelectMany( x => x ).Where(x => x.resourceName != String.Empty).OrderBy(x => x.roleName);
var rolesMerged = roles.Skip(1).Aggregate(
list = roles.Take(1).ToList(),
if (acc.prev.roleName == curr.roleName && acc.prev.resourceName == curr.resourceName) {
acc.list.RemoveAt(acc.list.Count() - 1);
resourceName = x.resourceName,
foreach (var r in rolesMerged){