我有一个ObservableCollection,大约有1000个对象需要由最终用户过滤(搜索)。用户必须能够按名称或员工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);
}
}
在此方法之前处理卫生。
这闻起来并不高效。我应该使用两种方法,还是有更好的方法来处理过滤?
我希望员工保持不变状态,这样我就可以将FilteredEmployees重新填充到完整列表中,而无需再次访问数据库。
答案 0 :(得分:2)
我知道这是一篇旧帖子,但我用它来帮助我过滤方面,并注意到SlipFish通过循环IEnumerable集合来创建ObservableCollection。
当ObservableCollection构造函数接受IEnumerable集合时,可以像这样创建ObservableCollection:
FilteredEmployees = new ObservableCollection<EmployeeServicesData>(filter);
答案 1 :(得分:1)
看起来您正在尝试查看searchText是否包含在员工姓名或员工编号中。
你可以这样做:
x.Name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0
x.EmployeeNumber.ToString().IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0
或者您可以使用StartsWith而不是IndexOf。
编辑:列表控件中存在大量数据的另一个问题是渲染需要很长时间。因此,如果您在启动时未经过滤并且Silverlight或WCF或者任何必须将所有1000渲染到控件中,即使您没有看到所有这些,也可能需要一点时间。 Silverlight 3有UI Virtualization,这可能是你在这里可以做的最好的优化。
答案 2 :(得分:1)
查看此帖子中的filtered observable集合。
答案 3 :(得分:0)
你可以通过PagedCollectionView。