Wie Cache-Liste implementieren

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Wie Cache-Liste implementieren

    Ich habe hier ein etwas komplexeres Problem.

    Eins nach dem anderen:
    Ich habe vor, von einer Website Bilder herunterzuladen. (Übrigens legal. Von der Website wird eine API dafür bereitgestellt.)

    Mit einem Aufruf an die API werden die Informationen über das Bild heruntergeladen. Das beinhaltet die URL zur Bild-Datei, eine URL zu einem Thumbnail, ein paar Tags, MD5-Hash, Höhe und Breite und noch einige andere Sachen. Der API wird dazu die ID des Bildes übergeben. Die ID steigt immer an. Es gibt keine Lücken. Anschließend wird über die URL das Bild heruntergeladen.
    Ich sehe mir diese Bilder an und entscheide, ob ich es behalten will.
    Diese Informationen sollen (zusätzlich zu den Bildern und Thumbnails selbst) in einer Cache-Liste gespeichert werden.

    Und hier liegt das Problem.
    Es gibt als erstes das aktuelle Item mit einer ID. Dann soll eine gewisse Anzahl an Items vorausgeladen werden (Die ID wird erhöht). Weiters soll eine gewisse Anzahl an Cache-Einträgen behalten werden. Aber nur, wenn diese direkt aufeinander folgen.
    Ein Beispiel:
    Die aktuelle ID ist 10 und es sollen 5 Bilder vorausgespeichert und 5 behalten werden.
    Der Cache sieht also im ersten Moment so aus:

    Quellcode

    1. 5x Behalten | 1x Aktuell | 5x Vorausgeladen
    2. () () () () () (10) () () () () ()
    Klammern mit Zahlen sind geladene Inhalte, Klammern ohne Zahlen sind Platzhalter.
    Nach und nach werden Elemente vorausgeladen, bis die Liste so aussieht.

    Quellcode

    1. () () () () () (10) (11) (12) (13) (14) (15)

    Im Normalfall wird die ID des aktuellen Elements um 1 erhöht.
    Die Liste wird dabei um 1 Platz nach links verschoben:

    Quellcode

    1. () () () () (10) (11) (12) (13) (14) (15) ()

    Und das letzte Element wird vorausgeladen:

    Quellcode

    1. () () () () (10) (11) (12) (13) (14) (15) (16)

    Die anderen Elemente werden behalten, weil es nicht selten vorkommt, dass ich mal ein Element zurückgehe. Dabei wird das ganz rechte Item verworfen und die Liste wird nach rechts verschoben:

    Quellcode

    1. () () () () () (10) (11) (12) (13) (14) (15)

    Das wäre noch relativ einfach, aber mich hängt's bei folgendem aus:
    Wenn ich jetzt von ID 10 zu beispielsweise ID 18 springe, wie baue ich dann die Liste um? Wie finde ich heraus, welche Elemente noch gebraucht werden und wohin diese kommen?

    Ein weiteres Problem ist, dass ich die Einträge gerne nach unterschiedlichen Informationen filtern würde. Das heißt, wenn die Bilder mit den IDs 10, 11, 13, 16 und 17 zutreffen, sollen auch diese in der Liste vorkommen. Wenn also zum nächsten Element gesprungen wird, wird nicht einfach die ID erhöht.

    Also wie implementiert man so einen Cache vernünftig?
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Gib jedem Objekt zunächst einen Enum mit, der beschreibt, was Du willst:

    VB.NET-Quellcode

    1. VölligNeuesBild
    2. ThumbnailGeladen
    3. Behalten
    4. NichtBehalten
    sollte reichen.
    Im WorkFlow musst Du dann nur noch dafür sorgen, dass die NichtBehalten-Einträge eliminiert werden und die Behalten-Einträge nach dem Speichern des Bildes. Und dann wird wieder die nächste 5er Gruppe prozessiert.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Aber wie finde ich jetzt heraus, welche nicht behalten werden sollen? Denn das ergibt sich ja aus der Position in der Liste. Ich möchte es aber vermeiden, die Elemente in der Liste nach links und rechts zu schieben.
    Und wie finde ich heraus, welche Elemente ich behalten kann, wenn ich zu einem anderen Element springe?

    Im Grunde brauche ich diese Information von einem Element: An welcher Position relativ zum aktuellen Element es sich befindet.
    Ich denke, damit kann ich alles andere herausfinden:
    Wenn >= Anzahl behaltener Elemente, behalten.
    Wenn <= Anzahl vorausgeladener Elemente, behalten.
    Ansonsten verwerfen.
    Die Elemente werden in der Reihenfolge ins neue Array kopiert, in der sie im alten sind.
    Alle Lücken vom aktuellen Element bis zum letzten vorausgeladenen werden nacheinander aufgefüllt.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Niko Ortner schrieb:

    Denn das ergibt sich ja aus der Position in der Liste.
    Sorry, das hab ich so nicht verstanden, das hab ich (D)einer visuellen Auswahl (z.B. mit Klick drauf) zugeordnet.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Im Endeffekt wird's auch in einer Liste angezeigt Nur wenn man auf einen Eintrag in der Liste klickt, wird der zum aktuellen Element und die Liste wird verschoben.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Wie ist denn ühaupt der Workflow bei Deiner List?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!