2016-09-15 28 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