2016-01-24 76 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

你說得對,它會退出,因爲返回結束執行,謝謝指出。 –