繁体   English   中英

如何合并C#谓词

[英]How to combine c# predicates

嗨,我有两个谓词。 我想知道是否有可能将它们以某种方式结合在一起? 第一:

Predicate<object> viewFilter = f =>
{
    ExternalUser u = f as ExternalUser;
    return u.AgentName.ToLower().StartsWith(agentName.ToLower());
};

第二:

Predicate<object> viewFilter = f =>
{
    ExternalUser u = f as ExternalUser;
    return u.ExternalLogin.ToLower().StartsWith(login.ToLower());
};

这就是连接谓词的外观。

Predicate<object> viewFilter = f =>
{
    ExternalUser u = f as ExternalUser;
    return u.ExternalLogin.ToLower().StartsWith(login.ToLower()) && u.AgentName.ToLower().StartsWith(agentName.ToLower());
};

对于WPF数据网格过滤器(网格源为ICollectionView),我需要它。 因此,在创建谓词后,将其设置为如下所示的过滤器:

private void FilterByLogin(ICollectionView view, string login)
{
    Predicate<object> viewFilter = f =>
    {
        ExternalUser u = f as ExternalUser;
        return u.ExternalLogin.ToLower().StartsWith(login.ToLower());
    };
    view.Filter = viewFilter;
}

我将创建两个新方法:

public static Prediate<object> Cast<T>(Predicate<T> inner)
{
    return new Predicate<object>(o => inner((T)o));
}

public static Predicate<T> And<T>(Predicate<T> p1, Predicate<T> p2)
{
    return x => p1(x) && p2(x);
}

那么您可以从谓词中删除类型转换并将其移至顶层:

Predicate<ExternalUser> first = u => u.AgentName.ToLower().StartsWith(agentName.ToLower());
Predicate<ExternalUser> second = u => u.ExternalLogin.ToLower().StartsWith(login.ToLower());

view.Filter = Cast(And(first, second));

确实应该像这样简单:

Predicate<object> viewFilter1 = f =>
{
    ExternalUser u = f as ExternalUser;
    return u.AgentName.ToLower().StartsWith(agentName.ToLower());
};

Predicate<object> viewFilter2 = f =>
{
    ExternalUser u = f as ExternalUser;
    return u.ExternalLogin.ToLower().StartsWith(login.ToLower());
};

Predicate<object> viewFilter = f => viewFilter1(f) && viewFilter2(f);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM