Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda表达式替代多个if语句_C#_Lambda_Expression_Predicate - Fatal编程技术网

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)));
    }