代码之家  ›  专栏  ›  技术社区  ›  SAT

为什么在if中使用LINQ会更改属性

  •  3
  • SAT  · 技术社区  · 6 年前

    当我使用 someList.Where(t => t.isTrue = true) 什么都没发生。但当我使用下面给出的代码时,

     if(someList.Where(t => t.isTrue = true).Count() > 0) 
        return;
    

    列表中的所有项目都设置为true。为什么会这样?

    编辑:我没有试图分配或比较任何内容。我很好奇为什么与一起使用时会发生这种情况 if .

    2 回复  |  直到 6 年前
        1
  •  12
  •   Titian Cernicova-Dragomir    6 年前

    之所以会发生这种情况,是因为您使用了赋值( = )平等的比较( == ).

    而且,只有当您使用 Count 因为LINQ只在lambda表达式必须获取值时才计算它。

    var q = someList.Where(t => t.isTrue = true); // Nothing will happen 
    q.ToList() // would happen here 
    if(q.Count() > 0 ) { .. } // Also here
    

    要比较而不指定应使用的值,请执行以下操作:

    var q = someList.Where(t => t.isTrue == true); 
    var q = someList.Where(t => t.isTrue);  // Or simpler
    

    编译器允许这样做的原因是赋值是一个有值的表达式。例如:

    int a = 10;
    int b;
    int c = (b = a) ; // (a=b) is of type int even though it also assigns a value, and b and c will have a value of 10
    

    在您的情况下 bool 具有类型 布尔 ,它恰好是传递给的lambda的有效返回值 Where

        2
  •  3
  •   Marcus Höglund    6 年前

    使用时,列表中的所有项目都设置为true = 然后使用 Count() .

    由于isTrue是一个布尔值,这就足以计算为真的值

    if(someList.Where(t => t.isTrue).Count() > 0) 
        return;
    

    作为检查计数是否大于0的替代方法,您可以使用已经执行该操作的Any方法

    if(someList.Where(t => t.isTrue).Any())  // Any returns true if there are any elements in the collection
        return;
    

    您可以通过将条件作为参数的任意重载来进一步简化此过程,跳过额外的Where

    if(someList.Any(t => t.isTrue))  // This overload takes a function that returns a boolean like Where does and returns true if there is at least 1 element that matches the condition
        return;