C# 按用户输入筛选ObservableCollection

C# 按用户输入筛选ObservableCollection,c#,silverlight,C#,Silverlight,我有一个大约1000个对象的可观察集合,需要最终用户过滤(搜索)。用户必须能够按姓名或员工id进行搜索。列表控件将使用FilteredEmployees,员工将加载页面加载上的所有内容 我目前已将其设置为: public ObservableCollection<EmployeeServicesData> Employees { get; set; } public ObservableCollection<EmployeeServicesData> FilteredEm

我有一个大约1000个对象的可观察集合,需要最终用户过滤(搜索)。用户必须能够按姓名或员工id进行搜索。列表控件将使用FilteredEmployees,员工将加载页面加载上的所有内容

我目前已将其设置为:

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);
    }
}
publicobservableCollection雇员{get;set;}
公共ObservieCollection FilteredEmployees{get;set;}
内部空筛选器员工(字符串搜索文本,bool isByName)
{
如果(searchText.Length>0)
{
IEnumerabe过滤器;
if(isByName)
filter=Employees.Where(x=>x.Name.Length>=searchText.Length).Where(x=>x.Name.Substring(0,searchText.Length)==searchText.ToUpper());
其他的
筛选器=EmployeeNumber.ToString().Length>searchText.Length)。其中(x=>x.EmployeeNumber.ToString().Substring(0,searchText.Length)=文本);
foreach(员工服务数据筛选中的员工)
FilteredEmployees.Add(员工);
}
}
在使用这种方法之前先处理卫生问题

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


我希望员工保持不变状态,这样我就可以将FilteredEmployees重新填充到完整列表中,而无需再次点击DB。

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

您可以这样做:

x.Name.IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0
x.EmployeeNumber.ToString().IndexOf(searchText, StringComparison.OrdinalIgnoreCase) >= 0
或者可以使用StartsWith而不是IndexOf


编辑:列表控件中包含大量数据的另一个问题是渲染需要很长时间。因此,如果您在启动时未对其进行过滤,Silverlight或WCF或其他任何东西必须将所有1000个渲染到控件中,即使您没有看到所有这些,这可能需要一点时间。Silverlight 3有,这可能是你在这里能做的最好的优化。

我知道这是一篇老文章,但我用它来帮助我过滤方面,并注意到SlipFish通过循环IEnumerable集合来创建ObservableCollection

当ObservaleCollection构造函数接受IEnumerable集合时,ObservaleCollection可以这样创建:

FilteredEmployees = new ObservableCollection<EmployeeServicesData>(filter);
FilteredEmployees=新的可观察集合(filter);

看看这篇文章的收藏。

你可以通过PagedCollectionView查看这篇文章


查看此博客文章以获取示例:

您的列表控件是什么类型的?如果它可以直接使用过滤过的员工而不是复制他们,那就太好了,但是只有1000名员工,这可能根本不重要。只是在FilteredEmployees上绑定了一个常规的旧列表框,目前由一个分页网关填充,所以没有问题。了解+1非常有用,请尝试一下这段代码,这正是我想要的,谢谢你指出这一点!