using System.Collections.Generic;
public DateTime? StartEffectiveDate
public DateTime? EndEffectiveDate
public static void Main()
var contracts = new List<Contract>();
var contractA = new Contract()
StartEffectiveDate = new DateTime(2021, 03, 20),
EndEffectiveDate = new DateTime(2021, 04, 8),
contracts.Add(contractA);
var contractB = new Contract()
StartEffectiveDate = new DateTime(2021, 03, 22),
EndEffectiveDate = new DateTime(2021, 04, 12),
EndDate = new DateTime(2021, 04, 10),
contracts.Add(contractB);
var contractC = new Contract()
StartEffectiveDate = new DateTime(2021, 03, 25),
EndEffectiveDate = new DateTime(2021, 04, 25),
contracts.Add(contractC);
var contractD = new Contract()
StartEffectiveDate = new DateTime(2021, 03, 10),
contracts.Add(contractD);
List<DateTime?> dates = new List<DateTime?>();
dates.AddRange(contracts.Where(m => m.StartEffectiveDate.HasValue).Select(m => m.StartEffectiveDate));
foreach (var m in contracts)
if (m.EndDate.HasValue && m.EndEffectiveDate.HasValue) date = m.EndDate > m.EndEffectiveDate ? m.EndEffectiveDate : m.EndDate;
else if (m.EndDate.HasValue) date = m.EndDate;
else date = m.EndEffectiveDate;
Console.WriteLine("Dates: " + string.Join(" | ", dates.Select(m => m.ToString())));
DateTime startEffectiveDate = dates.Where(m => m.HasValue).Select(m => m.Value).Min();
DateTime? endEffectiveDate = dates.Any(m => !m.HasValue) ? null : dates.Where(m => m.HasValue).Max();
Console.WriteLine("Start Effective Date: " + startEffectiveDate);
Console.WriteLine("End Effective Date: " + endEffectiveDate);