2012-09-24 78 views
0

在Python,我可以做這樣的事情,我認爲這是更清晰,比2雙條件語句的一個聲明:在單個if語句中使用多個條件?

if 1 < 2 < 3: 
    print 'triple testing?' 

else: 
    print 'more like triple failing!' 

不運行任何問題,但在C#中,將第一比較, 1 < 2轉成bool後繼續前進,所以它拋出異常Operator '<' cannot be applied to operands of type 'bool' and 'int'

有沒有辦法避免添加第二個條件,所以我不必將三元條件拆分成兩組對,而不是像我在Python中可以做的那樣是一個「三元」條件?

if (1 < 2 & 2 < 3) { ... } 

編輯:在這裏我想用這樣的一個例子是確保一個int是一個數字範圍之間。

if ((0 < x) && (x < 10) { ... } //I can already do this 
vs 
if (0 < x < 10) { ... } //Would rather have something like this 
+0

您在第二個示例中的方法應該可以正常工作。如果不是,那麼你有其他問題(忽略了你使用硬編碼值的事實作爲說明的目的,你需要使用正確的布爾運算符)。 – slugster

+0

@slugster是的,它的確如此,但我覺得它不像「1 <2 <3」那麼優雅。我正在尋找替代我結束的例子。我似乎還不夠清楚。 – TankorSmash

回答

2

在C#中沒有辦法做1 < 2 < 3。然而,你可以寫一個快速的擴展方法來模仿它:

public static class Test 
{ 
    public static bool IsSorted<T>(this IEnumerable<T> e) 
    { 
     return e.Zip(e.Skip(1), (a, b) => Comparer<T>.Default.Compare(a, b)) 
      .All(x => x <= 0); 
    } 
} 

... 

if (new[] { 1, 2, 3 }.IsSorted()) 
{ 
    // Do something 
} 

如果絕對是大材小用了3個數字,但如果有更多的值進行比較,否則將無法硬編碼可能是有用的。

+1

+1:好主意,大概可以改進它給一個謂詞作爲擴展方法的一個參數,所以這個謂詞必須適用於所有具有indeces的對(i,i + 1) – horgh

+0

@KonstantinVasilcov同意。 LINQ似乎缺乏創建元素對或元組並對其執行操作的方法。聚合似乎差不多但不完全。 – akton

6

將條件分組。試試這個,

if ((1 < 2) && (2 < 3)) 
{ 
    // statements here 
} 
else 
{ 
    // statements here 
} 
+0

在這種情況下,分組/括號不是必需的,OP只需鍵入完整表達式。 – slugster

+2

對於完整的代碼塊+1 ......這是一個小的東西,但我認爲它使得它更具可讀性,並有助於在上下文中提供答案。 –

+1

我想我的問題是模糊的。我想知道是否有辦法*避免*做這樣的事情,並且做一些更接近'1 <2 <3'的事情,如果只是爲了少打字。 – TankorSmash

3

對了,還有,你正在尋找

If ((1 < 2) && (2< 3)) { doWhatever(); } 

&&是邏輯運算符,還有||邏輯OR。

+0

謝謝你的回答,但我原來的問答中可能沒有說清楚。爲此我瘋了一些編輯。不管怎麼說,多謝拉! – TankorSmash