Обобщенный кэш с приоритетом и временем жизни

C# Сложный generics

Задача «Обобщенный кэш с приоритетом и временем жизни»

Реализуйте обобщенный класс Cache<TKey, TValue>, который хранит элементы с заданным временем жизни (TimeToLive) и приоритетом (int). При добавлении элемента, если кэш превышает максимальный размер, удаляется элемент с наименьшим приоритетом, а при равном приоритете — самый старый. По истечении TimeToLive элемент считается просроченным и не возвращается при запросе. Методы: Add(TKey key, TValue value, int priority) — добавляет или обновляет элемент; TryGet(TKey key, out TValue value) — возвращает true, если ключ существует и не просрочен, иначе false; RemoveExpired() — удаляет все просроченные элементы. Реализуйте потокобезопасность с помощью блокировок.

Формат ввода

Первая строка: максимальный размер кэша (int) и время жизни в секундах (int). Вторая строка: количество команд N (int). Далее N строк, каждая команда: 'add ключ значение приоритет' или 'get ключ' или 'remove_expired'.

Формат вывода

Для каждой команды 'get' выведите значение, если ключ найден и не просрочен, иначе 'null'. Для 'remove_expired' выведите количество удалённых элементов. Для 'add' ничего не выводите.

Примеры

Пример 1

ВВОД
3 5 8 add a 10 1 add b 20 2 get a add c 30 3 add d 40 1 get b get d remove_expired
ВЫВОД
10 null 40 1

Пример 2

ВВОД
2 10 6 add x 100 5 add y 200 5 get x add z 300 5 get y get z
ВЫВОД
100 null 300
main.cs