[C#] - ListBox such Funktion

02/16/2015 11:49 Lee Ki-Hwan#1
Hey Coders,
hab eine Frage, undzwar schreibe ich ein Programm in dem ich Daten abrufe und es in ein Object (Item) speicher.
Nun loope ich eine Liste mit den Objecten und füge jeweils 2 Eigenschaften in eine Listbox hinzu (index+ " - " + name).

Alles schön und gut, aber da es sehr viele Items sind muss natürlich eine Such funktion her, das hier und noch andere Methoden habe ich ausprobiert:
Code:
if(input != null)
            {
                list.Items.Clear();
                foreach(var item in list.Items)
                {
                    if (item.ToString().IndexOf(input, StringComparison.OrdinalIgnoreCase) >= 0)
                    {
                        list.Items.Add(item);
                    }
                }
            }
Allerdings klappt das einfach nicht, weil ich keinen Exakten Wert suche.

Beispiel:
In der Listbox steht zur Auswahl: "1 - Test" / "2 - est" / "3 - st"..
Was ich möchte ist, wenn ich in das search Field jetzt sagen wir mal Test eingebe, das alle 3 angezeigt werden, da die Character ja vorhanden sind, oder wenn ich 1 eingebe, das jedes Listbox Item angezeigt wird wo ne 1 vor kommt.
Ich hoffe man kann verstehen was ich meine.
Was noch gut wäre aber kein muss, wenn es eine schnelle Methode ist, da es über 10K items sind.
MfG

Edit:
Anscheinend bin ich noch nicht so Wach, is ja Montag! das list.Items.Clear() weg machen, dann findet man natürlich ein Match... Jetzt gehts super!
02/16/2015 22:19 warfley#2
Noch 2 Verbesserungsvorschläge meinerseits:
1. Verwende list.BeginUpdate und list.EndUpdate um die Performance zu erhöhen
2. Dynamischer datentyp Var ist unschön, nimm doch lieber den Typen Object
02/17/2015 08:33 Aeh'#3
[Only registered and activated users can see links. Click Here To Register...]

Schau mal den ersten Post nach der Frage an.
02/17/2015 09:14 Lee Ki-Hwan#4
Danke für die Antworten.
Das mit dem Dynamischen Datentyp hab ich schon geändert, ich werde mir die vorschläge mal angucken, und dann posten was ich habe, falls dann jemand danach sucht, dass er auch fündig wird :p
02/17/2015 22:13 stotterer09#5
vll. einen Baum verwenden und keine Liste damit sparst du dir verdammt viel Zeit beim Durchsuchen
Ich weiß leider nicht genau was du durchsuchst also kann ein Baum auch ne schlechte Idee sein
02/18/2015 11:03 Aeh'#6
Generell Anstatt einer Liste würde ich dir auch raten zu der ObservableCollection zu wechseln.
Diese aktualisieren sich im Hintergrund im Gegensatz zu einer Liste selbst.

Lies dir am besten mal den MSDN Eintrag dazu durch.
[Only registered and activated users can see links. Click Here To Register...]
02/18/2015 18:34 Else#7
[Only registered and activated users can see links. Click Here To Register...]
02/18/2015 19:18 Dungedragon#8
Habe diese Lösung in einem meiner alten codes gefunden (für WPF):

Code:
private void txtBxSearch_TextChanged(object sender, TextChangedEventArgs e)
{
            string searchText = txtBxSearch.Text;

            // bzw. auch: LstBxItems.Items.Filter = (obj) =>
            LstBxItems.Items.Filter = delegate(object obj)
            {	
				if(String.IsNullOrEmpty(searchText))
					return true;
					
				Item item = obj as Item;

				if(item == null) 
                                        return false;
			
				string str = item.ToString();		
				
				if (String.IsNullOrEmpty(str))
					return false;
					
                                int index = str.IndexOf(searchText, 0,    
                                                    StringComparison.OrdinalIgnoreCase);
				
                return (index > -1);
            };
}
Hierbei werden alle Einträge die den text von txtBxSearch enthalten in der ListBox gefiltert. Der code wurde im TextChanged event implementiert.

Ein Beispiel für die implementierung in einem anderen context wäre folgendes:

[Only registered and activated users can see links. Click Here To Register...]

Hoffe das ist wonach du gesucht hast.