Forum: PC-Programmierung (VB.net) Letzte X Einträge aus Listbox kopieren


von Rutz (Gast)


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()

von Schlaumaier (Gast)


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.

von Schlaumaier (Gast)


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. ;)

von Rutz (Gast)


Lesenswert?

Wie ich die Einträge einer For Schleiffe rauskopiere ist mir klar.
Ich wollte wissen ob es eine Möglichkeit gibt, die Items als Array 
direkt heraus zu kopieren.

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

Rutz schrieb:
> OHNE einer Schleife

von Schlaumaier (Gast)


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.

von cppbert (Gast)


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

von Rutz (Gast)


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.

von cppbert (Gast)


Lesenswert?

Rutz schrieb:
> Darum keine Schleiffen.

Es gibt noch CopyTo

ListBox1.Items.CopyTo(arr1, 0)

von Cppbert (Gast)


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

von Klaus P. (kpi6288)


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.

von Rutz (Gast)


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()

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.