[英]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.