我有一个大约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.
您似乎正在尝试查看 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 虚拟化,这可能是您可以在此处进行的最佳优化。