如何组合c#谓词

如何组合c#谓词,c#,wpf,C#,Wpf,嗨,我有两个谓词。我想知道是否有可能以某种方式将它们结合在一起? 第一: Predicate viewFilter=f=> { ExternalUser u=f作为ExternalUser; 返回u.AgentName.ToLower().StartsWith(AgentName.ToLower()); }; 第二: Predicate<object> viewFilter = f => { ExternalUser u = f as ExternalUser;

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

Predicate viewFilter=f=>
{
ExternalUser u=f作为ExternalUser;
返回u.AgentName.ToLower().StartsWith(AgentName.ToLower());
};
第二:

Predicate<object> viewFilter = f =>
{
    ExternalUser u = f as ExternalUser;
    return u.ExternalLogin.ToLower().StartsWith(login.ToLower());
};
Predicate viewFilter=f=>
{
ExternalUser u=f作为ExternalUser;
返回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());
};
Predicate viewFilter=f=>
{
ExternalUser u=f作为ExternalUser;
返回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;
}
private void FilterByLogin(ICollectionView视图,字符串登录)
{
谓词viewFilter=f=>
{
ExternalUser u=f作为ExternalUser;
返回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);
}
public静态预测转换(谓词内部)
{
返回新谓词(o=>internal((T)o));
}
公共静态谓词和(谓词p1、谓词p2)
{
返回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 first=u=>u.AgentName.ToLower().StartsWith(AgentName.ToLower());
谓词second=u=>u.ExternalLogin.ToLower().StartsWith(login.ToLower());
view.Filter=Cast(和(第一、第二));

我将创建两个新方法:

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);
}
public静态预测转换(谓词内部)
{
返回新谓词(o=>internal((T)o));
}
公共静态谓词和(谓词p1、谓词p2)
{
返回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 first=u=>u.AgentName.ToLower().StartsWith(AgentName.ToLower());
谓词second=u=>u.ExternalLogin.ToLower().StartsWith(login.ToLower());
view.Filter=Cast(和(第一、第二));

其实应该这么简单:

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);
谓词视图过滤器1=f=>
{
ExternalUser u=f作为ExternalUser;
返回u.AgentName.ToLower().StartsWith(AgentName.ToLower());
};
谓词viewFilter2=f=>
{
ExternalUser u=f作为ExternalUser;
返回u.ExternalLogin.ToLower().StartsWith(login.ToLower());
};
谓词viewFilter=f=>viewFilter1(f)和&viewFilter2(f);

其实应该这么简单:

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);
谓词视图过滤器1=f=>
{
ExternalUser u=f作为ExternalUser;
返回u.AgentName.ToLower().StartsWith(AgentName.ToLower());
};
谓词viewFilter2=f=>
{
ExternalUser u=f作为ExternalUser;
返回u.ExternalLogin.ToLower().StartsWith(login.ToLower());
};
谓词viewFilter=f=>viewFilter1(f)和&viewFilter2(f);

除了问题之外;为什么在不检查
null
的情况下将
用作
?这意味着您现在可以确定类型,只需使用简单的cast
(ExternalUser)f
。这样,当由于某种模糊的原因失败时,您将得到一个InvalidCastException,而不是一个NullReferenceException,它更清楚地说明了问题所在。请注意:如果不检查null,请不要将
用作
。而是直接投<代码>外部用户u=(外部用户)f问题之外的可能的重复项;为什么在不检查
null
的情况下将
用作
?这意味着您现在可以确定类型,只需使用简单的cast
(ExternalUser)f
。这样,当由于某种模糊的原因失败时,您将得到一个InvalidCastException,而不是一个NullReferenceException,它更清楚地说明了问题所在。请注意:如果不检查null,请不要将
用作
。而是直接投<代码>外部用户u=(外部用户)f可能重复的