C# Lambda表达式替代多个if语句
我正在尝试实现一个表达式函数替代方案C# Lambda表达式替代多个if语句,c#,lambda,expression,predicate,C#,Lambda,Expression,Predicate,我正在尝试实现一个表达式函数替代方案 private static Expression<Func<UserProfile, bool>> CompareFilter(FilterViewModel f) { ... } 有没有一种方法可以将这么多嵌套的if语句适合于lambda表达式,或者适合于expression函数的其他语句?其思想是验证所有if语句,只有在所有if语句都没有返回false时才返回true 提前谢谢 首先,您当前的方法很长,因为您没有
private static Expression<Func<UserProfile, bool>> CompareFilter(FilterViewModel f)
{
...
}
有没有一种方法可以将这么多嵌套的if语句适合于lambda表达式,或者适合于expression函数的其他语句?其思想是验证所有if语句,只有在所有if语句都没有返回false时才返回true
提前谢谢 首先,您当前的方法很长,因为您没有充分利用布尔逻辑。可以简化为:
private static bool CompareFilter(UserProfile profile, FilterViewModel filter)
{
if (filter.FirstName != null && filter.FirstName != profile.FirstName)
{
return false;
}
if (filter.TownId != null && filter.TownId != profile.TownId)
{
return false;
}
// true if at least one of the filter interests match
if (filter.InterestsIds != null &&
!profile.Interests.Any(i => filter.InterestsIds.Contains(i.Id)))
{
return false;
}
...
return true;
}
您可以将其转换为一个庞大的表达式1:
一旦你有了这个,把它变成lambda并得到你的表达式
,就很容易了:
私有静态表达式比较过滤器(FilterViewModel f)
{
返回配置文件=>
(filter.FirstName==null | | filter.FirstName==profile.FirstName)&&
(filter.TownId==null | | filter.TownId==profile.TownId)&&
(filter.InterestsIds==null||
profile.Interests.Any(i=>filter.Interests.Contains(i.Id));
}
!()
围绕它:返回!( (...) || (...) || (...));代码>,但将所有内容反转,并将条件与&&
结合起来,这样会更好
首先,您当前的方法很长,因为您没有充分利用布尔逻辑。可以简化为:
private static bool CompareFilter(UserProfile profile, FilterViewModel filter)
{
if (filter.FirstName != null && filter.FirstName != profile.FirstName)
{
return false;
}
if (filter.TownId != null && filter.TownId != profile.TownId)
{
return false;
}
// true if at least one of the filter interests match
if (filter.InterestsIds != null &&
!profile.Interests.Any(i => filter.InterestsIds.Contains(i.Id)))
{
return false;
}
...
return true;
}
您可以将其转换为一个庞大的表达式1:
一旦你有了这个,把它变成lambda并得到你的表达式
,就很容易了:
私有静态表达式比较过滤器(FilterViewModel f)
{
返回配置文件=>
(filter.FirstName==null | | filter.FirstName==profile.FirstName)&&
(filter.TownId==null | | filter.TownId==profile.TownId)&&
(filter.InterestsIds==null||
profile.Interests.Any(i=>filter.Interests.Contains(i.Id));
}
!()
围绕它:返回!( (...) || (...) || (...));代码>,但将所有内容反转,并将条件与&&
结合起来,这样会更好
我想知道什么会更好。例如:(filter.FirstName==null | | filter.FirstName==p.FirstName)。我认为,通过将| | or运算符替换为三元运算符(filter.FirstName==null?true:filter.FirstName==p.FirstName),如果第一个条件为true,我可以跳过第二个条件的检查。但我听说三元运算符速度很慢。@nev.angelova不,使用条件运算符来实现这一点完全没有意义。C#中的
|
运算符使用短路求值,这意味着如果左侧为真
,则不会求值右侧。我想知道有什么更好的方法。例如:(filter.FirstName==null | | filter.FirstName==p.FirstName)。我认为,通过将| | or运算符替换为三元运算符(filter.FirstName==null?true:filter.FirstName==p.FirstName),如果第一个条件为true,我可以跳过第二个条件的检查。但我听说三元运算符速度很慢。@nev.angelova不,使用条件运算符来实现这一点完全没有意义。C#中的|
运算符使用短路求值,这意味着如果左侧为真
,则不会求值右侧。
private static bool CompareFilter(UserProfile profile, FilterViewModel filter)
{
return (filter.FirstName == null || filter.FirstName == profile.FirstName) &&
(filter.TownId == null || filter.TownId == profile.TownId) &&
(filter.InterestsIds == null ||
profile.Interests.Any(i => filter.Interests.Contains(i.Id)));
// etc. etc.
}
private static Expression<Func<UserProfile, bool>> CompareFilter(FilterViewModel f)
{
return profile =>
(filter.FirstName == null || filter.FirstName == profile.FirstName) &&
(filter.TownId == null || filter.TownId == profile.TownId) &&
(filter.InterestsIds == null ||
profile.Interests.Any(i => filter.Interests.Contains(i.Id)));
}