Вариант 1, с парсингом дат:
var dates = new[] {
"20.11.2021",
"10.11.2020",
"18.08.2017",
"20.05.2019",
"06.10.2013"
};
var lateDates = from date in dates
let value = DateOnly.ParseExact(date, "dd.MM.yyyy") // DateOnly добавили в .net6, но можно спокойно вместо него использовать DateTime
where value.Day == 20
select value; // вместо value можно выьрать date
foreach(var d in lateDates)
Console.WriteLine(d);
Вариант 2, через split:
var dates = new[] {
"20.11.2021",
"10.11.2020",
"18.08.2017",
"20.05.2019",
"06.10.2013"
};
var lateDates = from date in dates
let dayPart = date.Split(".", 2)[0]
let dayOfMonth = int.Parse(dayPart) // тут можно тупо без парсинга сделать where dayPart == "20"
where dayOfMonth == 20
select date;
foreach (var d in lateDates)
Console.WriteLine(d);
В обоих случаях вместо parse можно использовать TryParse, чтобы обработать ошибку нормально, но тогда немного сложнее будет код.
3. Ещё весёлый вариант, специально под такую задачу.
Можно тупо проверять, что строка начинается с 20
var data = dates.Where(x => x.StartsWith("20."));
foreach(var d in data)
Console.WriteLine(d);