2009-09-22 27 views
6

Tôi có một ObservableCollection của khoảng 1000 đối tượng cần được lọc (tìm kiếm) bởi người dùng cuối. Người dùng phải có khả năng tìm kiếm theo tên hoặc id của nhân viên. Danh sách kiểm soát tiêu thụ FilteredEmployees và nhân viên được tải lên với tất cả mọi thứ trên tải trang.Lọc một ObservableCollection bằng đầu vào của người dùng

Tôi hiện đã thiết lập nó như vậy:

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

vệ sinh được xử lý trước khi phương pháp này.

Điều này không có mùi rất hiệu quả. Tôi có nên sử dụng hai phương pháp cho việc này hay không, có cách nào tốt hơn để xử lý lọc không?

Tôi muốn giữ Nhân viên ở trạng thái không thay đổi để tôi có thể khôi phục lại FilteredEmployees vào danh sách đầy đủ mà không cần nhấn lại vào DB.

+0

Kiểm soát danh sách của bạn là loại gì? Nó sẽ được gọn gàng nếu nó có thể tiêu thụ các nhân viên lọc trực tiếp thay vì sao chép chúng, nhưng chỉ với 1000 nó có lẽ không quan trọng cả. –

+0

Chỉ cần một ListBox cũ thường xuyên ràng buộc trên FilteredEmployees – Slipfish

Trả lời

1

Có vẻ như bạn đang cố gắng xem liệu searchText có được chứa trong tên Nhân viên hay trong Số nhân viên hay không.

Bạn có thể làm điều này thay vì:

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

Hoặc bạn có thể sử dụng StartsWith thay vì IndexOf.

Chỉnh sửa: Một vấn đề khác với Kiểm soát danh sách với lượng lớn dữ liệu trong đó là mất nhiều thời gian để hiển thị. Vì vậy, nếu bạn có nó không lọc khi bạn bắt đầu và Silverlight hoặc WCF hoặc bất cứ điều gì đã làm cho tất cả 1000 vào kiểm soát ngay cả khi bạn không nhìn thấy tất cả chúng, nó có thể mất một chút thời gian. Silverlight 3 có UI Virtualization, có thể là tối ưu hóa tốt nhất bạn có thể làm ở đây.

+0

Nó hiện đang được lấp đầy bởi một cổng phân trang, do đó, không có vấn đề ở đó. – Slipfish

2

Tôi biết đây là một bài đăng cũ nhưng tôi đã sử dụng nó để giúp tôi với khía cạnh lọc và nhận thấy rằng SlipFish đang tạo ObservableCollection bằng cách vòng quanh bộ sưu tập IEnumerable.

Như các nhà xây dựng ObservableCollection chấp nhận một bộ sưu tập IEnumerable ObservableCollection có thể được tạo ra như thế này:

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

rất hữu ích khi biết +1 – electricalbah

1

Hãy xem bài này cho một bộ sưu tập filtered observable.

+0

đã thử mã này, chính xác những gì tôi đang tìm kiếm, cảm ơn bạn đã chỉ ra điều này! –

Các vấn đề liên quan