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),这非常有效。谢谢你在这方面教育我:)