【问题标题】:How to count the number of elements that match a condition with LINQ如何计算与 LINQ 条件匹配的元素数量
【发布时间】:2013-06-19 02:30:07
【问题描述】:

我尝试了很多东西,但对我来说最合乎逻辑的似乎是这个:

int divisor = AllMyControls.Take(p => p.IsActiveUserControlChecked).Count();

AllMyControlsUserControls 的集合,我想知道有多少UserControlsIsActiveUserControlChecked 属性设置为true。

我在 VS 中得到的是:

Cannot convert lambda expression to type 'int' because it is not a delegate type

我的表情有什么问题?

【问题讨论】:

    标签: c# linq count


    【解决方案1】:
    int divisor = AllMyControls.Where(p => p.IsActiveUserControlChecked).Count()
    

    或者干脆

    int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
    

    由于您是初学者,因此值得一看 Enumerable 文档

    【讨论】:

    • 更简单 :D int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
    • @keyboardP 我在您发表评论之前将此添加到答案中,但感谢您的输入:)
    【解决方案2】:

    为什么不直接使用Count== true 语句也是高度冗余的。

    int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
    

    此外,您的Take 方法出现错误,因为它正在等待int。您需要从要获取的集合的开头指定连续元素的数量,您不能放置 lambda 表达式。为此,您需要使用TakeWhile。所以

    int divisor = AllMyControls.TakeWhile(p => p.IsActiveUserControlChecked == true).Count();
    

    本来是正确的,但不会像您期望的那样工作;一旦条件被打破,它就会停止。因此,如果 AllMyControls 包含 true, true, false, trueTakeWhileCount 将返回 2 而不是您预期的 3。

    【讨论】:

    • 是的,实际上在我的代码中它必须是 !=true,为了清晰起见,我喜欢这样。感谢您的建议
    • @Sturm 哦,那你可以写!p.IsActiveUserControlChecked而不是!= true== false
    【解决方案3】:

    Take 的参数需要int,并且您正在传递一个委托/ lambda 表达式。 Take 旨在仅获取第一个 count 元素。

    您可以使用Count 方法并传入一个委托来计算符合其条件的元素。这样,您只需对 IEnumerable 进行一次迭代,而不是先剔除不符合您条件的那些,然后再对它们进行实际计数。

    AllMyControls.Count(p => p.IsActiveUserControlChecked);
    

    【讨论】:

      【解决方案4】:

      不要KISS

      int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
      

      【讨论】:

        【解决方案5】:

        试试

        int divisor = AllMyControls.Where(x => x.IsActiveUserControlChecked == true).Count();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-07
          • 2021-12-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多