通过用户输入过滤ObservableCollection

时间:2009-09-22 15:33:47

标签: c# silverlight

我有一个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重新填充到完整列表中,而无需再次访问数据库。

4 个答案:

答案 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)