C# 过滤ICollectionView,以便根据搜索词的存在时间对字符串进行排序
我希望根据搜索到的字符串在每个字符串中出现的时间,排列一个名为C# 过滤ICollectionView,以便根据搜索词的存在时间对字符串进行排序,c#,string,list,sorting,collectionview,C#,String,List,Sorting,Collectionview,我希望根据搜索到的字符串在每个字符串中出现的时间,排列一个名为FilteredStrings的字符串对象ICollectionView。正在使用CollectionViewSource.GetDefaultView(_repository.GetObjects())实例化我的ICollection GetObjects()只返回存储库中收集的IEnumerable() 我的原始列表如下所示: ObjAect ObjectA AObject ObjectB ObjectC 用户将在UI中键入搜索
FilteredStrings
的字符串对象ICollectionView。正在使用CollectionViewSource.GetDefaultView(_repository.GetObjects())实例化我的ICollection代码>
GetObjects()
只返回存储库中收集的IEnumerable()
我的原始列表如下所示:
ObjAect
ObjectA
AObject
ObjectB
ObjectC
用户将在UI中键入搜索框,因此在本例中,他们将搜索A
,然后ICollectionView应进行过滤,以仅显示包含搜索文本m的字符串,然后根据搜索测试出现的时间对其重新排序
结果应该是:
AObject
ObjAect
ObjectA
我当前的代码如下所示:
public void Search(string searchText)
{
if (string.IsNullOrWhiteSpace(searchText))
{
FilteredComponentViewModels.Filter = null;
return;
}
FilteredComponentViewModels.Filter = s => s.IndexOf(searchText, StringComparison.CurrentCultureIgnoreCase) >= 0;
}
对于支持排序的ICollectionView
实现(可通过CanSort
属性识别),我们可以将IComparer
的实现分配给ICollectionView.CustomSort
属性
由于我们的基础集合只是IEnumerbale
,因此我们可以使用System.Runtime.Extensions.dll
程序集中的System.StringComparer
的现有实现:
FilteredComponentViewModels = GetDefaultView(_repository.GetObjects())
as ListCollectionView;
FilteredComponentViewModels.CustomSort = StringComparer.CurrentCultureIgnoreCase;
您是在视图类中立即实现了ICollectionView
,还是从提供的一个离散实现(CollectionView
基类,或其子类BindingListCollectionView
,ListCollectionView
和ItemCollection
)进行了扩展?对此表示歉意,这是一个CollectionViewSource
。出于兴趣,我更新了post:),这会隐藏不包含搜索文本的值,然后将列表重新排序为:字符串首先包含搜索文本的顺序。就像我文章中的例子一样?否,您需要将FilteredComponentViewModels.CustomSort=StringComparer.CurrentCultureIgnoreCase
添加到搜索方法的末尾。您仍然需要设置过滤器
。顺便说一句,我还建议您将过滤器更改为使用Contains
而不是IndexOf
,这只是为了简单/清晰。还要注意作为ListView
-此ICollectionView
的实现支持排序(其CanSort
属性返回true),这非常有效。谢谢你在这方面教育我:)