2009-09-22 23 views
6

Ich habe eine ObservableCollection von ungefähr 1000 Objekten, die vom Endbenutzer gefiltert (gesucht) werden müssen. Der Benutzer muss in der Lage sein, nach Name oder Mitarbeiter-ID zu suchen. Das Listensteuerelement verbraucht FilteredEmployees und Employees wird beim Laden der Seite mit allem geladen.Filtern einer ObservableCollection durch Benutzereingabe

Ich habe es zur Zeit als solche eingerichtet:

public ObservableCollection<EmployeeServicesData> Employees { get; set; } 
public ObservableCollection<EmployeeServicesData> FilteredEmployees { get; set; } 

internal void FilterEmployee(string searchText, bool isByName) 
{ 
    if (searchText.Length > 0) 
    { 
     IEnumerabe<EmployeeServicesData> filter; 

     if (isByName) 
      filter = Employees.Where(x => x.Name.Length >= searchText.Length).Where(x => x.Name.Substring(0, searchText.Length) == searchText.ToUpper()); 
     else 
      filter = Employees.Where(x => x.EmployeeNumber.ToString().Length > searchText.Length).Where(x => x.EmployeeNumber.ToString().Substring(0, searchText.Length) == text); 

     foreach (EmployeeServicesData employee in filter) 
      FilteredEmployees.Add(employee); 
    } 
} 

Sanitation vor dieser Methode behandelt wird.

Dies riecht nicht sehr effizient. Sollte ich zwei Methoden dafür verwenden, oder gibt es eine bessere Möglichkeit, mit Filtern umzugehen?

Ich möchte Mitarbeiter in einem unveränderten Zustand halten, damit ich FilteredEmployees in die vollständige Liste neu füllen kann, ohne die DB erneut zu treffen.

+0

Welche ist Ihre List Control? Es wäre nett, wenn es die gefilterten Mitarbeiter direkt konsumieren könnte, anstatt sie zu kopieren, aber mit nur 1000 ist es wahrscheinlich überhaupt nicht wichtig. –

+0

Nur eine reguläre alte ListBox-Bindung für FilteredEmployees – Slipfish

Antwort

1

Es sieht so aus, als ob Sie versuchen zu sehen, ob sureText im Namen des Mitarbeiters oder in der Angestelltennummer enthalten ist.

Sie können dies stattdessen tun:

x.Name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 
x.EmployeeNumber.ToString().IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0 

Oder Sie könnten Starts statt IndexOf verwenden.

Edit: Ein weiteres Problem mit List Controls mit großen Datenmengen darin ist, dass es lange dauert zu rendern. Also, wenn Sie ungefiltert haben, wenn Sie starten und Silverlight oder WCF oder was auch immer alle 1000 in das Steuerelement rendern muss, obwohl Sie nicht alle sehen, kann es etwas dauern. Silverlight 3 hat UI Virtualization, was wahrscheinlich die beste Optimierung wäre, die Sie hier machen könnten.

+0

Es wird derzeit von einem ausgelagerten Gateway gefüllt, also keine Probleme dort. – Slipfish

2

Ich weiß, dies ist ein alter Beitrag, aber ich habe ihn verwendet, um mir mit dem Filteraspekt zu helfen und habe bemerkt, dass SlipFish die ObservableCollection durch Schleifen um die IEnumerable-Sammlung erstellt hat.

Als ObservableCollection Konstruktor akzeptiert eine IEnumerable Sammlung der ObservableCollection wie folgt erstellt werden:

FilteredEmployees = new ObservableCollection<EmployeeServicesData>(filter); 
+0

sehr nützlich zu wissen +1 – electricalbah

1

Werfen Sie einen Blick auf diesen Beitrag für eine filtered observable Sammlung.

+0

gab diesem Code einen Versuch, genau das, was ich suchte, danke für das Aufzeigen! –

Verwandte Themen