Strings Temporär in einer Liste Speichern

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von froyo321.

    Strings Temporär in einer Liste Speichern

    Nabend,

    Sitze hier aktuell vor einem Problem bei dem ich nicht weiter komme, ich möchte mehrere Strings unabhängig voneinander 10 Sekunden lang in einer liste Speichern und sobald die 10 Sekunden eines jeweiligen Strings aufgelaufen sind, diesen wieder aus der Liste entfernen, habe das ganze bereits mit ausweich listen u.ä. versucht, bislang aber ohne Erfolg, gibt es da ggf. einen einfachen weg das ganze elegant und stabil zu lösen?

    MfG.
    Mir würden gerade 2 Methoden einfallen. Die erste wäre, dass du für jeden String einen Timer oder Thread erstellst, was aber jedoch sehr ineffizient wäre. Die zweite Möglicheit wäre, dass du eine eigene Klasse erstellst, die den String und das Datum des Hinzufügens beinhaltet. In einem seperaten Thread müsstest du dann (in einer Schleife) nur noch den Timespan bestimmen und sobald dieser 10sec. beträgt, löscht der Thread die Klasse aus deiner List(of ).

    Mojo schrieb:

    Die zweite Möglicheit wäre, dass du eine eigene Klasse erstellst, die den String und das Datum des Hinzufügens beinhaltet. In einem seperaten Thread müsstest du dann (in einer Schleife) nur noch den Timespan bestimmen und sobald dieser 10sec. beträgt, löscht der Thread die Klasse aus deiner List(of ).


    Habe ich bereits versucht, allerdings würde sobald ich einen Eintrag aus der Liste entferne es zu einem Laufzeit fehler führen, da ich ja die entsprechenden Werte per For Each durchgehen würde.
    Könntest du mal deinen Ansatz hier mal posten?

    Edit: Mal eine Frage nebenbei. Können nicht auch Fehler auftreten, wenn gleichzeitig von zwei Threads auf die List(Of ) zugegriffen wird? Wenn ja, dann müsste man sich ja des System.Collections.Concurrent-Namespaces bedienen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mojo“ ()

    Wie bereits gesagt wurde, erstelle eine Klasse. Warte dann x-Sekunden ab (Stichwort: Async) und löse dann ein Event aus. Im Handler dieses Events entfernst Du dann das Object aus der Liste. Es gibt keine Notwendigkeit für eine Schleife.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Das ist meine Lösung für mein Notification-System meines Sudoku-SOlvers. Die Main-Form hat das Event "Notify" abboniert.
    Dateien
    • Notification.cs

      (1,82 kB, 112 mal heruntergeladen, zuletzt: )
    • Notifications.cs

      (3,82 kB, 105 mal heruntergeladen, zuletzt: )
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    Prinzipiell kannst du auch zu jedem String eine entsprechende Integer-Variable mit dem Wert 0 festlegen und startest dann einen Timer mit der Dauer von 1 Sekunde. Bei jedem Timer.Tick-Event wird die Variable dann mit 1 addiert. Wenn der Wert 10 ist entfernst du den String eben aus der Liste. Gerade bei mehreren Variablen wird das aber schnell unordentlich und der Timer wird eh nicht so gerne gesehen.
    @froyo321 Nimm ein Dictionary(Of DateTime, String), wo jeder String mit seiner Startzeit eingetragen wird. In einer Timer_Tick-Prozedur schmeißt Du dann alle Einträge raus, die älter sind als nn.
    Feddich.
    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!
    Ein Dictionary ist aber doch eiglich für eine Suche nach Schlüsseln da.
    Hier aber soll doch einfach der Reihe nach reingetan werden, und der Reihe nach wieder raus, also First in - First out - Fifo, alias Queue(Of T).
    Und - wurde schon gesagt, nur mit Strings geht das nicht, sondern man braucht eine Klasse, die den String enthält und das Date.

    Klar, nimmt man ein Dictionary(Of String, Date), dann legt das ja intern KeyValuePair(Of String, Date) an, und das ist ja eine Klasse, die String und Date enthält

    Aber wirklich auf die Problematik ausgerichtet ist das nicht, denn ein Dictionary ist keine Queue.

    Also es sind mehrere Ansätze denkbar, mein Favorit ist: Verwende Queue(Of T).
    Und für T nimm Tuple(Of String, Date) - sodass sich ingesamt ergibt: Queue(Of Tuple(Of String, Date))

    Wer den Objectbrowser zu nutzen weiss, sollte mit diesen Stichworten Queue(Of T) sowie Tuple(Of T1, T2) recherchieren können, um damit eine Lösung zu implementieren: VisualStudio richtig nutzen (Google ist nicht deine Mami)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    eiglich
    muss man die Klassen verwenden, wofür sie taugen.
    Ich werde doch nicht von der Softwarepolizei verhaftet, wenn ich das Problem mit einem Dictionary(Of DateTime, String) löse. :thumbsup:
    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!

    RodFromGermany schrieb:

    muss man die Klassen verwenden, wofür sie taugen.
    Wie gesagt: Dictionary taugt fabelhaft für den Zugriff anhand von Schlüsseln.
    Für eine Fifo-Anforderung kann mans natürlich auch missbrauchen, ohne verhaftet zu werden, aber wenn du eine Klasse suchst, die wirklich für eine Fifo-Anforderung taugt - nimm Queue(Of T).

    Ist performanter und bildet die Anforderung angemessener ab (daher leichter verständlich), und ist auch kein Mehr-Aufwand - eher im Gegenteil.
    Es erfordert nur bisserl Verständnis der Programmierung, und auch die Fähigkeit, Klassen zu verwenden, die man vlt. vorher noch nicht gekannt hat. Dieses Problem ist aber ebensogut auch eine Chance.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke sconmal für all eure Beitrage :)

    RodFromGermany schrieb:

    @froyo321 Nimm ein Dictionary(Of DateTime, String), wo jeder String mit seiner Startzeit eingetragen wird. In einer Timer_Tick-Prozedur schmeißt Du dann alle Einträge raus, die älter sind als nn.
    Feddich.


    Wenn ich das ganze so versuchen würde zulösen wäre ich ja wieder bei dem Problem das ich die Abfrage über eine Schleife lösen müste, und sobald sich die Liste nunmal ändert (sprich ich einen Wert der "zualt" ist entferne" kommt es zum Fehler.

    die Anderen Vorschläge werde ich nun auch mal versuchen ( ob ich es hinbekomme :) )

    MfG.

    SpaceyX schrieb:

    löse dann ein Event aus. Im Handler dieses Events entfernst Du dann das Object aus der Liste. Es gibt keine Notwendigkeit für eine Schleife.


    Mal probiert?
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    ich denke nicht, dass ein Event hier sinnvoll wäre.
    Weil es gibt keine andere Möglichkeit, auf "zu alt" zu reagieren, als regelmäßig einen Timer zu konsultieren, und nachzugucken, ob "zu alt" eingetreten ist.

    Und wenn man eh einen Timer braucht, dann ist sinnvoll, nur einen zu verwenden, und nicht jedes einzelne Objekt mit seinem eigenen Timer auszustatten.

    Und ich sags noch einmal: eine Schleife ist nicht wirklich nötig.
    In einer FiFo-Liste ist immer das Element, was grad dran ist, auch das älteste - die danach kommenden Elemente kommen auch zeitlich gesehen "danach".

    aber in diesem Punkt gebe ich dir sehr recht: :thumbsup:

    SpaceyX schrieb:

    Mal probiert?
    Weil wenn froyo321 weiterhin nur abstrakt drüber redet, und keine praktischen Versuche macht, und Test-Codes postet und dergleichen, denke ich nicht, dasser irgendwie voran kommt.

    Es sei denn, es findet sich einer, der das Problem für ihn löst.

    ErfinderDesRades schrieb:

    und nachzugucken, ob "zu alt" eingetreten ist.


    Das ist nicht richtig.

    ErfinderDesRades schrieb:

    nd nicht jedes einzelne Objekt mit seinem eigenen Timer auszustatten.


    Macht doch Keiner.

    Aber gut. Da hier eh nur die Vollprofis am Werk sind, bin ich mal raus.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    ErfinderDesRades schrieb:

    wenn froyo321 weiterhin nur abstrakt drüber redet, und keine praktischen Versuche macht, und Test-Codes postet und dergleichen, denke ich nicht, dasser irgendwie voran kommt.

    Es sei denn, es findet sich einer, der das Problem für ihn löst.


    Habe es nun mit

    VB.NET-Quellcode

    1. Queue(Of Tuple(Of String, Date))
    und einem entsprechenden Prüf Timer (so wie es scheint) gelöst, danke dafür. :thumbsup:

    hatte vorher leider keine Zeit das ganze entsprechend zu testen/in einem Test Projekt zu realisieren, da ich die entsprechenden Beiträge (unter anderem eben deinen) erst ~8 Minuten vor dem zitierten Beitrag richtig durchgelesen habe.

    MfG.