通过用户输入过滤ObservableCollection

Sli*_*ish 6 c# silverlight

我有一个大约1000个对象的ObservableCollection需要由最终用户过滤(搜索).用户必须能够按名称或员工ID进行搜索.列表控件使用FilteredEmployees和Employees在页面加载时加载了所有内容.

我目前设置如下:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

在此方法之前处理卫生.

这闻起来不是很有效.我应该使用两种方法,还是有更好的方法来处理过滤?

我希望将Employees保持在未更改状态,这样我就可以将FilteredEmployees重新填充到完整列表,而无需再次访问DB.

Mik*_*ord 1

您似乎正在尝试查看 searchText 是否包含在员工姓名或员工编号中。

你可以这样做:

x.Name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0
x.EmployeeNumber.ToString().IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0
Run Code Online (Sandbox Code Playgroud)

或者您可以使用 StartsWith 而不是 IndexOf。

编辑:包含大量数据的列表控件的另一个问题是渲染需要很长时间。因此,如果您在启动时未对其进行过滤,并且 Silverlight 或 WCF 或其他任何工具必须将所有 1000 个渲染到控件中,即使您看不到所有这些,也可能需要一点时间。Silverlight 3 具有UI 虚拟化,这可能是您可以在此处进行的最佳优化。