我尝试了很多东西,但对我来说最合乎逻辑的就是这个:
int divisor = AllMyControls.Take(p => p.IsActiveUserControlChecked).Count();
AllMyControls
是UserControls
的集合,我想知道的是有多少UserControls
将IsActiveUserControlChecked
属性设置为true。
我在VS中得到的是:
Cannot convert lambda expression to type 'int' because it is not a delegate type
我的表情有什么问题?
答案 0 :(得分:50)
int divisor = AllMyControls.Where(p => p.IsActiveUserControlChecked).Count()
或只是
int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
既然你是初学者,那么值得一看Enumerable
文档
答案 1 :(得分:5)
为什么不直接使用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
,TakeWhile
Count
将返回2而不是预期的3。
答案 2 :(得分:1)
不要KISS
int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
答案 3 :(得分:1)
Take
的参数需要int
并且您正在传递委托/ lambda表达式。 Take旨在获取元素的第一个count
。
您可以使用Count
方法并传入委托来计算符合其条件的元素。这样你只需迭代IEnumerable一次,而不是先剔除那些不符合你标准的那些,然后再次实际计算它们。
AllMyControls.Count(p => p.IsActiveUserControlChecked);
答案 4 :(得分:0)
尝试
int divisor = AllMyControls.Where(x => x.IsActiveUserControlChecked == true).Count();