2016-01-24 54 views
0

我有一个MyClass类,它有一个方法MyFunction,它返回一个布尔值。那么我的MyClass一个阵列MYARRAY,我需要返回true,如果这个数组有一个对象,其中MyFunction的返回true,实际上我用这样的:c#数组有条件的元素

bool MyOtherFunction() { 
    foreach (MyClass x in MyArray.Where(y => y.MyFunction)) 
     { 
      return true; 
     } 
    return false; 
} 

但Visual Studio中不断警告我,因为“局部变量‘X’从来没有使用过“,那么,如何在不声明新变量的情况下检查它?

+0

你想使用'if'而不是'foreach'循环吗? – rhughes

回答

3

您可以

return MyArray.Any(x => x.MyFunction()); 

您当前的功能基本上是过滤掉不从调用MyFunction的返回true任何结果替换你的函数的整个身体。如果有结果,您将开始枚举您的Where筛选器的结果,并在第一个项目返回true。如果没有结果,就没有任何东西可以枚举,并且你将返回false。通过使用LINQ的Any方法,您将直接枚举,直到数组的MyFunction调用中的某个项目返回true,此时您将满足条件并可以返回true。如果MyFunction是一个潜在的昂贵调用,那么当你真正想要的所有元素都返回时,如果任何一个元素恰好为真,这比执行数组中每个可能元素的函数要快得多。当然,如果价格昂贵,如果所有元素都返回false,你将被卡住执行。

+0

答案是正确的,解释('Where'如何工作)不是。 “(像大多数LINQ一样)'和'Any'一样懒。所以'MyFunction'不会被调用超过绝对必要的方式。换句话说,这两个方法体都按照你解释“任何”的方式工作。 – Corak

+0

你说得对,它会退出,因为返回结束执行,谢谢指出。 –