Generalisierter Cache mit Priorität und Lebensdauer

C# Hard generics

Aufgabe «Generalisierter Cache mit Priorität und Lebensdauer»

Implementieren Sie eine generische Klasse Cache<TKey, TValue>, die Elemente mit einer bestimmten Lebensdauer (TimeToLive) und Priorität (int) speichert. Beim Hinzufügen eines Elements, wenn der Cache die maximale Größe überschreitet, wird das Element mit der niedrigsten Priorität entfernt, bei gleicher Priorität das älteste. Nach Ablauf der Lebensdauer gilt das Element als abgelaufen und wird bei einer Abfrage nicht zurückgegeben. Methoden: Add(TKey key, TValue value, int priority) – fügt ein Element hinzu oder aktualisiert es; TryGet(TKey key, out TValue value) – gibt true zurück, wenn der Schlüssel existiert und nicht abgelaufen ist, sonst false; RemoveExpired() – entfernt alle abgelaufenen Elemente. Implementieren Sie die Threadsicherheit mithilfe von Sperren.

Eingabeformat

Erste Zeile: maximale Cache-Größe (int) und Lebensdauer in Sekunden (int). Zweite Zeile: Anzahl der Befehle N (int). Danach N Zeilen, jeder Befehl: 'add schlüssel wert priorität' oder 'get schlüssel' oder 'remove_expired'.

Ausgabeformat

Für jeden Befehl 'get' geben Sie den Wert aus, wenn der Schlüssel gefunden und nicht abgelaufen ist, sonst 'null'. Für 'remove_expired' geben Sie die Anzahl der entfernten Elemente aus. Für 'add' geben Sie nichts aus.

Beispiele

Beispiel 1

EINGABE
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
AUSGABE
10 null 40 1

Beispiel 2

EINGABE
2 10 6 add x 100 5 add y 200 5 get x add z 300 5 get y get z
AUSGABE
100 null 300
main.cs