Вот чистая проверка с использованием тщательно созданного селектора, который будет корректно сравниваться с вашим вариантом использования:
IEnumerable<DateTime> dates = ...;
DateTime firstDate = dates.First();
IEnumerable desired = Enumerable.Range(0, 60).Select(months => firstDate.AddMonths(months));
bool correct = dates.SequenceEqual(desired, date => date.Year*12 + date.Month);
Использование этого пользовательского SequenceEqual
:
public static bool SequenceEqual<T1, T2>(this IEnumerable<T1> first, IEnumerable<T1> second, Func<T1, T2> selector)
{
// uses the LINQ Enumerable.SequenceEqual method on the selections
return first.Select(selector).SequenceEqual(second.Select(selector));
}
// this is also useful, but not used in this example
public static bool SequenceEqual<T1, T2>(this IEnumerable<T1> first, IEnumerable<T1> second, Func<T1, T2> selector, IEqualityComparer<T2> comparer)
{
return first.Select(selector).SequenceEqual(second.Select(selector), comparer);
}