如何使用类型为<tsource> </tsource>的变量

时间:2014-12-09 08:45:01

标签: c# arrays predicate

我对c#的语法很陌生。

我正在声明一组ProcessProcess[] myProc,我正在尝试使用Count<>成员。

我试着像这样使用它:     if(myProc.Count() > 0) 但它似乎不起作用。

正确的语法应该是什么?

感谢。

编辑:编译器错误是:运算符&gt;不能应用于'方法组'和'int'

类型的操作数

为了澄清,我对函数的语法感兴趣。由于Count<>被声明为 int IEnumerable<TSource>.Count<TSource>(Func<TSource,bool> predicate),我对语法感到困惑。

当我使用C ++时,Vector大小的计数类似v.size(),所以我不确定应该如何处理Count<>

2 个答案:

答案 0 :(得分:3)

无论Count功能如何,您似乎只是想知道是否有任何进程。您应该使用.Any()方法。

确保添加:

using System.Linq;

(这也是您在Count中遇到的问题,因为Count是Linq方法)

然后,使用

if(myProcs.Any())
{

}

这里的优点是,如果有10,000个进程,那么Count()必须统计所有进程。 .Any找到第一个后返回true。这样效率更高。

或者,您也可以使用.Length > 0,但我更喜欢.Any()。

编辑:

正如JacquesB正确指出的那样,在Arrays的情况下(以及任何实现ICollection的东西,哪些数组都有),然后.Count()方法有一个优化,它将检查该类型是否实现了ICollection,以及它是否调用了Length相反,所以在这种情况下,任何效率都不高,但我仍然更喜欢它,因为它对我来说在语义上更有意义。

答案 1 :(得分:0)

如果类型参数可以由编译器推断,那么可能会让您感到困惑的是方法的类型参数是可选的。例如

myProc.Count<Process>()

相当于

myProc.Count()

因为myProc的类型是IEnumerable<Process>,所以编译器可以推断出类型参数ISource的值必须是Process。因此,明确说明它会使代码混乱。

现在问题中显示的签名实际上与您使用的签名不同。有一个Count的重载,它将谓词函数作为参数,但在代码中你使用没有谓词的代码,实际上看起来像这样:

int IEnumerable<TSource>.Count<TSource>()