Ну вот, наткнулся на еще один хороший принцип программирования - повторяжщиеся куски кода просто необходимо выносить в отдельные функции
читать дальше
Итак, у меня есть 2 типа событий - обычные, которые назначаются на конкретную дату и время. И регулярные - они назначаются на день недели и конкретное время.
Я должен опросить базу событий и посмотреть, не пора ли вывести оповещение о наступлении события.
Первым делом мы получаем статус события. Если оно обычное, то мы сравниваем дату и время с текущей датой и временем, а если регулярное, то сравниваем день и время с текущим днем и временем.
То есть и там и там мы сравниваем время.
Значит сверку времени можно вынести - и там и там она одинакова.
Тогда проверка распадается на три функции:
Первая функция оповестит нас о том, что день наступления события совпадает с текущим;
Вторая функция оповестит нас о том, что дата наступления события совпадает с текущей датой;
И третья функция оповестит нас о том, что время наступления события совпадает с текущим рвременем.
В результате вместо сложных вложенных и повторяющихся проверок получаем примерно такое:
если событие-регулярное, то
{если проверка дня и проверка времени дали истину, то играем оповещение}
иначе
{если проверка дня и проверка времени дали истину, то играем событие}
Все просто 
И напоследок прилагаю 2 скриншота окон программы:
Основное окно:

Окно редактирования/добавления оповещения:

Ток в C# это методы, а не функции :Р