Я не думаю, что ваши "другими словами" действительно повторяют проблему, которую вы описали в первую очередь, поэтому я отвечу на оба вопроса.
Вот довольно простой метод, который будет определять n-е появление определенного дня недели в данном месяце в данном году.
public static DateTime DayOccurrence(int year, int month, DayOfWeek day,
int occurrenceNumber)
{
DateTime start = new DateTime(year, month, 1);
DateTime first = start.AddDays((7 - ((int)start.DayOfWeek - (int)day)) % 7);
return first.AddDays(7 * (occurrenceNumber - 1));
}
Определить, какой понедельник (или любой другой день) месяца дата намного проще; просто возьмите потолок дня месяца / 7:
public static int DayOccurrence(DateTime date)
{
return (int)Math.Ceiling(date.Day / 7.0);
}