linq filter ICollectionView使用多个过滤器列表动态查看

mgdq6dx1  于 2023-11-14  发布在  其他
关注(0)|答案(1)|浏览(115)

我有一个ICollectionView从datagrid.它有4个字段名称,学校名称,性别,类.接口有一个搜索框,用户可以输入逗号分隔的值和ICollectionView将被过滤.
它是与单值工作,我怎么能这样做,以逗号分隔的列表工作。

List<string> NameList = filterText.Split(',').ToList();
List<string> SchoolNameList = filterText.Split(',').ToList();
List<string> GenderList = filterText.Split(',').ToList();
List<string> ClassList = filterText.Split(',').ToList();

字符串
下面是使用单个过滤器的代码

var query1 = new Predicate<object>(x => ((View)x).Name.ToLower().Contains(filterText));
var query2 = new Predicate<object>(x => ((View)x).SchoolName.ToLower().Contains(filterText));
var query3 = new Predicate<object>(x => ((View)x).Gender.ToLower().Contains(filterText));
var query4 = new Predicate<object>(x => ((View)x).Class.ToLower().Contains(filterText));

yourCostumFilter = new Predicate<object>(x =>
                                (query1(x) || query2(x) || query3(x) || query4(x) ));

view.Filter = yourCostumFilter;


它如何将工作与姓名列表,学校姓名列表,性别列表和类列表。请帮助。

fhity93d

fhity93d1#

诀窍是在拆分搜索过滤器后得到的列表上使用Any(),并检查当前值是否在集合中。由于filterText.Split(',')将在所有4种情况下返回同一个集合,因此无需进行四次拆分。此外,您可以在任何类型的集合上使用Any,因此无需使用ToList()
它的工作原理是这样的:

public ICollectionView FilteredCollection
{
    get
    {
        if (this.MyFullList == null) return null;
        var source = CollectionViewSource.GetDefaultView(this.MyFullList);
        source.Filter = p => DoFilter((MyObject)p);
        return source;
    }
}

private bool DoFilter(MyObject t)
{
    try
    {
        var filterList = filterText.Split(',');
        return (filterList.Any(f => f.Equals(t.Name, StringComparison.OrdinalIgnoreCase)) ||
               filterList.Any(f => f.Equals(t.SchoolName, StringComparison.OrdinalIgnoreCase)) ||
               filterList.Any(f => f.Equals(t.Gender, StringComparison.OrdinalIgnoreCase)) ||
               filterList.Any(f => f.Equals(t.Class, StringComparison.OrdinalIgnoreCase)));
    }
    catch
    {
        return true;
    }
}

字符串

相关问题