using System.Collections.Generic;
public static void Main()
var projects = new List<Project> {
new Project("P1", DateTime.Parse("12/21/2017"), DateTime.Parse("01/20/2018")),
new Project("P2", DateTime.Parse("12/01/2017"), DateTime.Parse("12/21/2017")),
new Project("P3", DateTime.Parse("10/25/2017"), DateTime.Parse("12/01/2017")),
new Project("P4", DateTime.Parse("09/17/2017"), DateTime.Parse("10/25/2017")),
new Project("P5", DateTime.Parse("08/01/2017"), DateTime.Parse("09/02/2017")),
new Project("P6", DateTime.Parse("06/25/2017"), DateTime.Parse("07/26/2017")),
new Project("P7", DateTime.Parse("04/20/2017"), DateTime.Parse("06/25/2017")),
Console.WriteLine(projects.Aggregate<Project, string>(string.Empty, (s, p) => $"{p.ToString()}\n{s}"));
projects = Consolidate(projects);
Console.WriteLine(projects.Aggregate<Project, string>(string.Empty, (s, p) => $"{p.ToString()}\n{s}"));
projects = new List<Project> {
new Project("P1", DateTime.Parse("12/21/2017"), DateTime.Parse("01/20/2018")),
new Project("P2", DateTime.Parse("12/01/2017"), DateTime.Parse("12/21/2017")),
new Project("P3", DateTime.Parse("10/25/2017"), DateTime.Parse("12/01/2017")),
new Project("P4", DateTime.Parse("09/17/2017")),
new Project("P5", DateTime.Parse("08/01/2017"), DateTime.Parse("09/02/2017")),
new Project("P6", DateTime.Parse("06/25/2017")),
new Project("P7", DateTime.Parse("04/20/2017"), DateTime.Parse("06/25/2017")),
Console.WriteLine(projects.Aggregate<Project, string>(string.Empty, (s, p) => $"{p.ToString()}\n{s}"));
projects = Consolidate(projects);
Console.WriteLine(projects.Aggregate<Project, string>(string.Empty, (s, p) => $"{p.ToString()}\n{s}"));
private static List<Project> Consolidate(List<Project> projects)
var result = new List<Project>();
if (!projects.Any()) return result;
result.Add(projects.First());
projects.Remove(projects.First());
if (result.Any(r => r.BeginDate == (p.EndDate.HasValue ? p.EndDate.Value : DateTime.Today) && r.Name != p.Name))
var match = result.First(r => r.BeginDate == (p.EndDate.HasValue ? p.EndDate.Value : DateTime.Today));
var index = result.IndexOf(match);
result[index] = new Project(match.Name, p.BeginDate, match.EndDate);
public Project(string name, DateTime beginDate) : this(name, beginDate, null) { }
public Project(string name, DateTime beginDate, DateTime? endDate)
public string Name { get; set; }
public DateTime BeginDate { get; set; }
public DateTime? EndDate { get; set; }
public override string ToString()
return $"{Name}:\t{BeginDate.ToShortDateString()}\t:\t{(EndDate.HasValue ? EndDate.Value.ToShortDateString() : "Present")}";