获取LINQ中的所有+ ve数量

时间:2011-11-16 13:04:12

标签: c# .net linq

我正在使用以下内容:

int[] a = {1, 2, 3, 0, 5, 0};
int x = a.Select(b => b != 0).Count(); 

我的值是 6 ,我怎么能 4 而不是 6

有人可以指导我。

6 个答案:

答案 0 :(得分:8)

int[] a = {1, 2, 3, 0, 5, 0}; 
int x = a.Where(b => b != 0).Count();

答案 1 :(得分:7)

其他人建议使用Where后跟Count,但你可以更简单地使用它:

int x = a.Count(b => b != 0);

这个overload of Count采用谓词,基本上只计算与谓词匹配的源序列的元素。

正如其他人所说,它不适用于Select的原因是项目 - 它不会过滤 。你可以使用:

// Works but is horrible...
int x = a.Select(b => b != 0).Count(z => z);

...但我确实建议你不要。

请注意,这些都不会影响您的标题,即查找值。为此,您需要:

int x = a.Count(b => b > 0);

答案 2 :(得分:6)

使用Where

 int x = a.Where(b => b != 0).Count();

Select()将序列的每个元素投影到新表单中。

答案 3 :(得分:3)

更改此行

 int[] a = {1, 2, 3, 0, 5, 0}; 
 int x = a.Select(b => b != 0).Count();  

int[] a = {1, 2, 3, 0, 5, 0}; 
int x = a.Where(b => b != 0).Count(); 

之间的差异

<强>其中

查找匹配的项目,并仅返回那些项目。

- &GT; IEnumerable<A> in,IEnumerable<A> out

选择

返回源中所有项的内容。那些东西可能是物品本身,但通常更像某种投射。

- &GT; IEnumerable<A> in,IEnumerable<B> out

答案 4 :(得分:2)

您的代码只是将集合投影到bools,如果值不为0则为true,而对于文件管理器用户,则为false

e.g。

int[] a = {1, 2, 3, 0, 5, 0};
int x = a.Where(b => b != 0).Count(); 

答案 5 :(得分:2)

您的错误是{1, 2, 3, 0, 5, 0}.Select(b => b != 0)只是{true, true, true, false, true, false},这又是6项。您最好使用Where,这样可以为您提供已过滤的序列:{1, 2, 3, 5}。对于生成的序列,您可以应用Count或其他任何内容。