31

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

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

AllMyControls是一个集合,我想知道有UserControls多少属性设置为 true。UserControlsIsActiveUserControlChecked

我在 VS 中得到的是:

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

我的表情有什么问题吗?

4

5 回答 5

67
int divisor = AllMyControls.Where(p => p.IsActiveUserControlChecked).Count()

或者干脆

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

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

于 2013-06-21T20:47:23.740 回答
7

为什么不直接使用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, true, TakeWhilewithCount将返回 2 而不是您预期的 3。

于 2013-06-21T20:49:33.247 回答
1

不要亲吻

int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
于 2013-06-21T20:49:11.207 回答
1

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

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

AllMyControls.Count(p => p.IsActiveUserControlChecked);
于 2013-06-21T20:56:27.550 回答
0

尝试

int divisor = AllMyControls.Where(x => x.IsActiveUserControlChecked == true).Count();
于 2013-06-21T20:47:56.957 回答