【问题标题】:Using more than one condition in linq's where method在 linq 的 where 方法中使用多个条件
【发布时间】:2016-11-23 20:49:06
【问题描述】:

我有一行代码使用 where:

codebase.Methods.Where(x => x.Body.Scopes.Count > 5);

如何插入多个条件?所以我可以说x => predicate && y => predicate

谢谢

【问题讨论】:

    标签: c#


    【解决方案1】:

    如果您愿意,可以将单独的条件合并到一个谓词中:

    codebase.Methods.Where(x => (x.Body.Scopes.Count > 5) && (x.Foo == "test"));
    

    或者您可以对每个条件使用单独的Where 调用:

    codebase.Methods.Where(x => x.Body.Scopes.Count > 5)
                    .Where(x => x.Foo == "test");
    

    【讨论】:

    • 考虑到包含大量信息的大子句,这两种情况是否具有相同的复杂性或第一种较慢?
    • @alaxid:我希望第二个会稍微慢一点,因为每个Where 调用都会产生少量额外开销(方法调用、委托调用等)。不过,在任何正常的日常情况下,我都不会担心这一点。
    • OR 子句呢?乘以 .Where 将充当 AND
    【解决方案2】:

    不,您不能在同一个地方定义 2 个委托,但您可以在彼此之后构建或将两者置于相同的条件下,像这样

     var result = codebase.Methods.Where(x => x.Body.Scopes.Count > 5 && x.Body.Scopes.name == "" );
    
    or 
    
     var result = codebase.Methods.Where(x => x.Body.Scopes.Count > 5 )
            .where( y=> y.Body.Scopes.name == '' );
    
    or 
    
     var result = codebase.Methods.Where(x => x.Body.Scopes.Count > 5  )
    .Union( codebase.Methods.Where(y => y.Body.Scopes.name == ''  ) );
    

    【讨论】:

      【解决方案3】:

      在您的示例中,y 来自哪里? Where 方法采用带有单个输入参数的 lambda,它表示您正在操作的序列的单个实例。

      当然,您可以针对x 设置多个条件:

      Where(x => x.Foo > 5 && x.Bar < 3)
      

      【讨论】:

        【解决方案4】:

        “y”代表什么?

        您可以只使用标准的 && 条件。不需要“y”:

        codebase.Methods.Where(x => x.Body.Scopes.Count > 5 && x.Body.SomethingElse < 14);
        

        【讨论】:

          【解决方案5】:

          我不明白。有什么不能做的?

          codebase.Methods.Where(x => x.Head.IsHairy && x.Body != null && x.Body.Scopes.Count > 5); 
          

          【讨论】:

          • 让你迷惑的 y 只是过滤器中要测试的 对象的替代品。它可能被称为“匿名代表”,但我不确定。无论如何,它只是为您提供了一个变量,用于在 lambda 表达式中访问您的类型的属性。你可以使用任何合法的变量名。
          【解决方案6】:

          像这样..

          codebase.Methods.Where(x => x.Body.Scopes.Count > 5 && x.Body.Scopes.Count < 10);
          

          【讨论】:

            【解决方案7】:
            codebase.Methods.Where(x => x.Body.Scopes.Count > 5).Where(x => x.Body.Scopes.TypeName == "Scopes").Where(x => x.Body.Scopes.Level == LEVEL_HIGH);
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-07-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多