如何使用LINQ计算与条件匹配的元素数
我尝试了很多东西,但对我来说最符合逻辑的是这个:
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
我的表情怎么了?
int divisor = AllMyControls.Where(p => p.IsActiveUserControlChecked).Count()
或简单地说
int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
由于您是初学者,因此查看Enumerable
文档是值得的
为什么不直接使用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
,带有Count
TakeWhile
将返回2而不是预期的3。
Take
的参数需要一个int
,你传递一个delegate / lambda表达式。 Take旨在获取元素的第一个count
。
您可以使用Count
方法并传入委托来计算符合其条件的元素。 这样您只需迭代IEnumerable一次,而不是先剔除那些不符合您标准的那些,然后再次实际计算它们。
AllMyControls.Count(p => p.IsActiveUserControlChecked);
不要吻
int divisor = AllMyControls.Count(p => p.IsActiveUserControlChecked);
尝试
int divisor = AllMyControls.Where(x => x.IsActiveUserControlChecked == true).Count();