过滤 ICollectionView 以根据搜索的术语存在的时间对字符串进行排序

Filter a ICollectionView to order strings based off of how early a searched for term exists

我正在寻找一个名为 FilteredStrings 的字符串对象的 ICollectionView,它基于搜索的字符串在每个字符串中出现的时间。我的 ICollection 正在用 CollectionViewSource.GetDefaultView(_repository.GetObjects());.

实例化

GetObjects() 只是 returns 一个 IEnumerable<string>() 已收集到存储库中。

我原来的列表是这样的:

ObjAect
ObjectA
AObject
ObjectB
ObjectC

用户将在 UI 中的搜索框中键入内容,因此在这种情况下,他们将搜索 A,然后 ICollectionView 应进行过滤以仅显示包含搜索文本的字符串,但然后还根据搜索到的测试出现的时间对它们重新排序。

结果应该是这样的:

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<string>,我们可以使用 System.Runtime.Extensions.dll 程序集中 System.StringComparer 的现有实现:

FilteredComponentViewModels = GetDefaultView(_repository.GetObjects())
                              as ListCollectionView;
FilteredComponentViewModels.CustomSort = StringComparer.CurrentCultureIgnoreCase;