2013-12-18 46 views
0

我很難用多選項if語句。如果(a或b)和c語句

版本1場比賽都沒有考慮& &。載有( 「向上」)

if ( 
    || drow["ifName"].ToString().ToLower().Contains("vlan") 
     || drow["ifName"].ToString().ToLower().Contains("st0") 
     || drow["ifName"].ToString().ToLower().Contains("ge-0") 
    && drow["ifStatus"].ToString().ToLower().Contains("up") 
) 

版本2場比賽沒有。

if ((
     || drow["ifName"].ToString().ToLower().Contains("vlan") 
     || drow["ifName"].ToString().ToLower().Contains("st0") 
     || drow["ifName"].ToString().ToLower().Contains("ge-0") 
    ) 
    && drow["ifStatus"].ToString().ToLower().Contains("up") 

我失蹤了嗎?

表基本上是這樣

ifName | ifStatus 
vlan.0 | up 
st0.1 | up 
pp0.0 | up 
ge-0/0/0 | down 

編輯:

所以我們的目標是隻匹配ifStatus = UP,也改變了表來闡明一個真實的例子行。

+4

無法重現。版本2在我看來應該是對的。 –

+0

我會先介紹變量以使代碼更易於閱讀... –

+5

您應該提取本地變量或2以提高可讀性。注意常見文本'drow [「ifName」]。ToString()。ToLower()'。 – ChaosPandion

回答

5

你想要的解析是什麼?邏輯OR(||)和邏輯AND(&&)都是左結合並具有不同的操作者優先級:

http://msdn.microsoft.com/en-us/library/aa691323(v=vs.71).aspx

邏輯與更緊密地比確實邏輯OR結合,所以,像

A || B || C && D 
表達

分析,就好像它寫

A || B || (C && D) 

如果這是你的意圖,你很好。如果沒有,您需要根據需要添加括號以獲得所需的解析。我的懷疑是你的意圖解析更像是:

(A || B || C) && D 

但這不是你的原始測試解析。

作爲一個很好的一般規則,如果您在邏輯表達式中混合使用AND和OR,總是使用括號來表示您的意圖。誤解邏輯表達式中的運算符優先級是錯誤的主要來源。

0

這可能不是解決您的問題,但它應該更容易看到你在做什麼,以及使列表更易於維護:

在第一種情況下
var matchNames = new[] {"a", "b", "c", "vlan.10"}; 
if (drow["ifStatus"].ToString().ToLower().Contains("up") //check up first, because it's cheaper 
    && matchNames.Any(m => drow["ifName"].ToString().ToLower().Contains(m)) 
{ 
    //... 
} 
-1

它產生true如果表達式(OR表達或AND表達式)中的任何一個評估爲true
注:它類似於if(A || B || C || D && E)

所以如果任何OR表達in (A,B,C)演算值爲true或表達D and E計算結果爲true變得true

在第二種情況下它產生true如果OR表達式中的任一個是trueAND表達drow["ifStatus"].ToString().ToLower().Contains("up")也如使用的是括號對必須是true

注:它類似於if((A || B || C || D) && (E))

所以如果OR表達(A,B,C,D)中的任何一個應該評估爲真,也和表達E必須是真實的,產生的結果true

試試這個:

String name=drow["ifName"].ToString().ToLower(); 
Sting status=drow["ifStatus"].ToString().ToLower(); 

if ((name.Contains("vlan.10") || name.Contains("a") || name.Contains("b") 
     || name.Contains("c")) && (status.Contains("up"))) 
+0

這是不正確的:如果drow [「ifname」]包含任何'「vlan.10」',''a「或'」b「',則第一種情況評估爲」真「,** OR **如果'drow [「ifname」]'包含「c」*和*'drow [「ifstatus」]'包含'「up」'。 –

+0

@NicholasCarey:對不起,這是我的錯,編輯我的帖子請看看。 –

0

您可以使用要做到這一點,對樣品中加入這個命名空間:

using System.Linq; 

,並嘗試這個辦法:

string[] items = new[] { "vlan.10", "a", "b", "c" }; 

if (drop["IfStatus"].ToString().IndexIf("up", StringComparison.OrdinalIgnoreCase) > -1 && 
    items.Any(x => drop["IfName"].ToString().IndexOf(x, StringComparison.OrdinalIgnoreCase) > -1) 
{ 
    // true...    
} 

閱讀關於Turkey Test,它顯示了爲什麼重要使用IgnoreCase方法com而不是Contains

0

在這裏使用正則表達式可以簡化邏輯。

if((Regex.IsMatch(drow["ifName"].ToString().ToLower(), "[abc]")) 
    && (Regex.IsMatch(drow["ifStatus"].ToString().ToLower(), "up"))) 
{ 
} 
相關問題