2016-09-15 51 views
0

我有一個短路情況的問題,我需要做的是檢查一個數組是否有近2個索引或字符串是否等於某個值,在這裏重新創建問題,假設這樣的:短路條件失敗

string[] favItem = new string[] { "hello", "world", "test", "foo" }; 
string temp = "hello"; 
var itemToRemove = temp.Split(','); 

foreach(var fav in favItem) 
{ 
    if(fav == "foo" || (itemToRemove.Length > 1 & fav == itemToRemove[0] || fav == itemToRemove[1])) 
    { 
    //do something 
    } 
} 

所以基本上我需要一個默認值來比較fav,如果失敗了,我需要檢查,如果itemToRemove陣列有近2索引,如果是我需要的fav值反覆比較,兩個指標分別爲itemToRemove

現在假設在itemToRemove只有一個指標,我無法從該退出:

(itemToRemove.Length > 1 & fav == itemToRemove[0] || fav == itemToRemove[1]) 
特別

&我試圖從狀態退出,如果索引AREN」兩個。

在調試模式下,我可以看到false值有斷點,但我不明白爲什麼代碼秋季:

OutOfRangeException

itemToRemove[1]時,應離開條件。

我在做什麼錯?

+1

一般的經驗法則是,在處理「bool」邏輯時,幾乎不會使用非短路運算符'&'和'|'。 – juharr

回答

4

您的代碼有兩個問題。

首先,短路布爾值「和」運算符是&&&是按位和運算符,並不短路。

其次,&&具有比||更高的優先級,所以您需要將第二個||分組在一起,像這樣(itemToRemove.Length > 1 && (fav == itemToRemove[0] || fav == itemToRemove[1]))。要記住優先級的經驗法則是and就像乘法0 && 1 = 0,而or就像是加法0 || 1 = 1

+0

謝謝,似乎工作正常:) – Unchained