C# 按用户输入筛选ObservableCollection
我有一个大约1000个对象的可观察集合,需要最终用户过滤(搜索)。用户必须能够按姓名或员工id进行搜索。列表控件将使用FilteredEmployees,员工将加载页面加载上的所有内容 我目前已将其设置为:C# 按用户输入筛选ObservableCollection,c#,silverlight,C#,Silverlight,我有一个大约1000个对象的可观察集合,需要最终用户过滤(搜索)。用户必须能够按姓名或员工id进行搜索。列表控件将使用FilteredEmployees,员工将加载页面加载上的所有内容 我目前已将其设置为: public ObservableCollection<EmployeeServicesData> Employees { get; set; } public ObservableCollection<EmployeeServicesData> FilteredEm
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非常有用,请尝试一下这段代码,这正是我想要的,谢谢你指出这一点!