(VB.net) Letzte X Einträge aus Listbox kopieren

Gast #7349743
Lesenswert?

Hallo Leute,

Ich habe in einem Projekt zwei Listboxen. Eine mit "allen" Items. Eine, die nur die letzten XXX items anzeigen soll.

Wie kann ich die letzten XX Items kopieren, OHNE einer Schleife? (Geschwindigkeit !)

Akteull werden alle Items kopiert mit:

1
lst_Messages.BeginUpdate()
2
lst_Messages.Items.Clear()
3
lst_Messages.Items.AddRange(lst_Messages_Thread.Items)
4
lst_Messages.SelectedIndex = lst_Messages.Items.Count - 1
5
lst_Messages.EndUpdate()
Gast #7349769
Lesenswert?

In den du den Index ausrechnest und angibst.

x = 1 neu_liste.items.add alte_liste.selectedindex(alte_liste.items.count -x).text

Mit x kannst du von Hinten steuern.

X = 1 ist der letzte Eintrag x = 2 der Vorletzte.

Wichtig ist nur das du kein Funktionsüberlauf hast. Also ein Eintrag ansprichst der nicht da ist. Kann man mit einigen Prüfungen aber abfangen.

Eine Schleife würde ich so ab 3-4 Einträgen aufwärts machen.

Ist dann der selbe Befehl. Nur wir X von der Schweife (for-Next) gesteuert.

Gast #7349779
Lesenswert?

Nachtrag.

SelectedIndex = -1 wenn im Feld nix drin steht. SelectedIndex = 0 wenn der erste Eintrag der Liste drin Steht

Weshalb du um die Anzahl Einträge zu bekommen, immer -1 (wegen der 0) machen musst.

Du kannst JEDEN Eintrag auch per Befehl als ersten machen.

Liste.selectedindex = 4 , zeigt den 3 Eintrag der Liste an. Wegen der 0. ;)

dim Inhalt as String. inhalt = Liste(3).text ' gibt den 4 Text der Liste aus.

So genug bei den Hausaufgaben geholfen. ;)

Gast #7349897
Lesenswert?

Rutz schrieb:

Rutz schrieb:

Wie kann ich die letzten XX Items kopieren, OHNE einer Schleife? (Geschwindigkeit !)

Also du willst ein Teil eines Array in ein anderes Array kopieren. Ohne das man weiß wohin man die kopiert. ??

Also so ein Befehl ist mir in der ganzen Zeit die ich code noch NIE vorgekommen. Was nicht heißt das es den ich gibt. Ich entdecke min. 1 x die Woche neue Funktionen / Methoden von Objekten.

Aber sorry, da kann ich dir nicht helfen.

Wie gesagt schon für 1-3 Stück rufe ich den Befehl direkt auf. Ab ca. 4 Nehme ich ne Schleife. Die ist nur Minimal langsamer, aber spart CODE.

Und so ganz nebenbei. Array können bei gewissen aufruf gewisser Array-Funktionen ne Menge seltsamen Mist machen. Besonders beim Sortieren. Deshalb mag ich die altmodische Methode.

Gast #7350462
Lesenswert?

Schlaumaier schrieb:

Wie gesagt schon für 1-3 Stück rufe ich den Befehl direkt auf. Ab ca. 4 Nehme ich ne Schleife. Die ist nur Minimal langsamer, aber spart CODE.

Was für ein Unfug - kleine Schleifen werden in .Net eh automatisch ausgerollt und noch dazu ist der Einfluss einer Schleife so dermaßen gering das du kaum in der Lage sein wirst ein Benchmark zu schreiben der das überhaupt aufzeigen kann

Gast #7351775
Lesenswert?

Es sollen ca. 1000 bis 5000 Einträge (eibstellbar) kopiert werden. Nachdem eine Listbox im GUIThread befüllt wird, sollte dies recht performant ausgeführt werden, um nicht die GUI zu auszubremsen. Die zweite public shared Listbox, bzw. List of Strings, wird von mehreren Threads befüllt. Dabei habe ich auf zwei keinen Einfluss, da externe managed DLL. Die Listboxen werden aktuell ca. Jede sekunde mit einem Eintrag ergänzt. Ab und zu auch fast jeden Tick. Darum keine Schleiffen.

Gast #7352023
Lesenswert?

Rutz schrieb:

Es sollen ca. 1000 bis 5000 Einträge (eibstellbar) kopiert werden. Nachdem eine Listbox im GUIThread befüllt wird, sollte dies recht performant ausgeführt werden

Warum bei der Menge überhaupt eine Listbox verwenden,den Inhalt kann doch sowieso kaum jemand direkt sehen

Ich denke dein Konzept ist irgendwie falsch, du solltest lieber im Hintergrund mit nicht-Gui Listen oder Arrays arbeiten und nur Teile davon im GUI anzeigen, die GUI Elemente sind zur Visualisierung nicht zur Verwaltung gedacht

#7352039
Lesenswert?

Die meisten Listen und Collections basieren intern auf einem Array. Daher ist ein ToArray() oft eine schnelle Methode, um daraus ein Array zu erstellen. Davon kann man mit Array.Copy() dann ein Sub-Array kopieren. Aber Du musst selbst Messungen machen oder Dich auf die Suche begeben, ob jemand genau dazu schon Messungen ermittelt hat. Manchmal kommt man zum Ergebnis, dass die Schleife doch nicht so schlecht abschneidet wie man annimmt. Besonders wenn die ursprüngliche Liste sehr groß ist.

Gast #7355790
Lesenswert?

Ich mach das jetzt wie folgt:

1
If lst_Messages_Thread.Items.Count > CInt(MaxLoggEntries) Then
2
  Do
3
      lst_Messages_Thread.Items.RemoveAt(0)
4
  Loop Until lst_Messages_Thread.Items.Count <= CInt(MaxLoggEntries)
5
End If
6
    
7
lst_Messages.BeginUpdate()
8
lst_Messages.Items.Clear()
9
lst_Messages.Items.AddRange(lst_Messages_Thread.Items)
10
lst_Messages.SelectedIndex = lst_Messages.Items.Count - 1
11
lst_Messages.EndUpdate()

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren