using System.Collections.Generic;
public static void Main()
string leaveSymbols = "AL,AL,AL,AL_AM";
var dateRanges = LeaveProcessor.ProcessLeaveSymbols(leaveSymbols);
Console.WriteLine("Start");
foreach (var range in dateRanges)
Console.WriteLine(range);
public class LeaveProcessor
public static List<DateRange> ProcessLeaveSymbols(string leaveSymbols)
var symbols = leaveSymbols.Split(',').Select(s => s.Trim()).ToList();
var dateRanges = new List<DateRange>();
var currentRange = new DateRange();
for (int i = 0; i < symbols.Count; i++)
var isLastSymbol = i == symbols.Count - 1;
if (currentRange.StartDate == null)
currentRange.StartDate = DateTime.Today.AddDays(i);
currentRange.EndDate = DateTime.Today.AddDays(i);
else if (symbol == "AL_AM")
if (currentRange.StartDate == null)
currentRange.StartDate = DateTime.Today.AddDays(i);
currentRange.EndDate = DateTime.Today.AddDays(i);
currentRange.EndHalfDay = HalfDay.AM;
dateRanges.Add(currentRange);
currentRange = new DateRange();
else if (symbol == "AL_PM")
if (currentRange.StartDate != null)
dateRanges.Add(currentRange);
currentRange = new DateRange
StartDate = DateTime.Today.AddDays(i),
EndDate = DateTime.Today.AddDays(i),
StartHalfDay = HalfDay.PM
dateRanges.Add(currentRange);
currentRange = new DateRange();
if (isLastSymbol && currentRange.StartDate != null)
dateRanges.Add(currentRange);
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }
public HalfDay? StartHalfDay { get; set; }
public HalfDay? EndHalfDay { get; set; }
public override string ToString()
if (StartDate == null || EndDate == null)
return "Invalid date range";
if (StartDate == EndDate)
if (StartHalfDay == HalfDay.PM)
return $"{StartDate:yyyy-MM-dd} PM";
else if (EndHalfDay == HalfDay.AM)
return $"{StartDate:yyyy-MM-dd} AM";
return $"{StartDate:yyyy-MM-dd}";
return $"{StartDate:yyyy-MM-dd} to {EndDate:yyyy-MM-dd}";