using System.Collections.Generic;
public static void Main()
var ps = Program.GetDatas();
var startDate = new DateTime(2023, 01, 07);
var endDate = new DateTime(2023, 01, 14);
ps.ApplyFilter(startDate, endDate).ToList()
.ForEach(r => Console.WriteLine($"[{r.Id}] {r.StartDate:dd/MM/yyyy} - {r.EndDate:dd/MM/yyyy}"));
public static List<Period> GetDatas() {
var list = new List<Period>();
list.AddRange(new List<Period>()
new Period(id++, new DateTime(2023, 01, 07), new DateTime(2023, 01, 14)),
new Period(id++, new DateTime(2023, 01, 06), new DateTime(2023, 01, 14)),
new Period(id++, new DateTime(2023, 01, 08), new DateTime(2023, 01, 13)),
new Period(id++, new DateTime(2023, 01, 01), null),
new Period(id++, new DateTime(2020, 01, 01), null),
new Period(id++, null, new DateTime(2024, 01, 31)),
new Period(id++, null, null),
list.AddRange(new List<Period>()
new Period(id++, new DateTime(2023, 01, 01), new DateTime(2023, 01, 05)),
new Period(id++, new DateTime(2023, 01, 15), new DateTime(2023, 01, 20)),
new Period(id++, new DateTime(2023, 01, 21), new DateTime(2023, 01, 24)),
new Period(id++, new DateTime(2023, 01, 25), new DateTime(2023, 01, 30)),
new Period(id++, new DateTime(2023, 01, 31), null),
new Period(id++, null, new DateTime(2022, 01, 31)),
public static class EnumerableExtension {
public static IEnumerable<Period> ApplyFilter(this IEnumerable<Period> periods, DateTime startDate, DateTime endDate) {
!(startDate > o.EndDate || endDate < o.StartDate) ||
(o.EndDate == null && o.StartDate <= endDate) ||
(o.StartDate == null && o.EndDate >= startDate)
public Period(int id, DateTime? startDate, DateTime? endDate) {
this.StartDate = startDate;
public int Id { get; set; }
public DateTime? StartDate { get; set; }
public DateTime? EndDate { get; set; }