2010-01-05 113 views
4

在SQL中,我可以作出若像以下 如果MY_STATE在(1,2,3,4)我可以使用C#中的linq壓縮if語句嗎?

在C#我聲明爲類型 如果(MY_STATE == STATE.CT || MY_STATE = = STATE.MA || MY_STATE == STATE.VA || MY_STATE == STATE.RI)

這顯然更笨拙。我可以使用LINQ來模仿sql的「in」語句嗎?

我正在尋找類似 如果(MY_STATE在(STATE.CT,STATE.MA,STATE.VA,STATE.RI))

+4

看起來像SQL的LINQ語法只能在C#中創建IEnumerables。你想要的是一個布爾結果,所以最接近的就是(new [] {State.CT,State.MA})。Contains(myState)。這比編寫if語句有更多的開銷;除非你的可接受狀態列表在運行時會變爲動態的,否則這樣做確實沒有意義。 – tclem 2010-01-05 15:36:55

+0

謝謝,我沒有考慮到這一點。我不希望將某些東西從編譯時改爲運行時,以使它看起來很漂亮。 – diadem 2010-01-05 15:44:39

回答

13
if (new [] {State.CT, State.MA, State.VA, State.RI}.Contains(myState)) { 
    // There you go 
} 
+0

我<3 c#in .Net 3.5! – 2010-01-05 15:53:14

+0

它看起來不錯。我喜歡輕鬆閱讀易於維護的代碼。有人知道與switch語句相比,性能如何? – 2010-01-05 17:04:32

+2

更糟。開關和if語句基本上是比較和跳轉。這是創建一個數組並進行循環,比較,中斷。 雖然有關係嗎?取決於你的用例。衡量一下:) – 2010-01-05 17:34:46

5

你想用包含,它映射到SQL IN 。我假設國家是一個枚舉並存儲爲一個整數。

var states = new int[] { (int)State.CT, (int)State.MA, (int)State.VA, (int)State.RI }; 

var query = db.States.Where(s => states.Contains(s.State)); 
+5

你速度更快;-)雖然我不喜歡int,但那可能就是我。 – 2010-01-05 15:37:01

+0

我不確定包含在「IEnumerable 」上,當DB上的字段是int時,將無法投射,我不認爲您可以將DB字段強制轉換爲枚舉的實例。雖然我可能是錯的。我沒有檢查它。如果是這樣,那麼我同意將它作爲枚舉類型的數組並放下演員陣容將是一條路。 – tvanfosson 2010-01-05 16:47:20

2

在C++中,我會使用switch語句。

switch (MY_STATE) { 
    case STATE.CT: 
    case.STATE.MA: 
    case.STATE.VA: 
    case.STATE.RI: 
    .... 
    break; 
} 

從記憶中只記下它。所以你可能會糾正一些語法問題。

+0

這是幾個讓我關注C#的東西之一。你可以用C++做到這一點,但你不能在C#中做到這一點。我不知道爲什麼。 – diadem 2010-01-05 15:37:30

+0

@diadem:你是什麼意思? C#確實有一個switch語句。 – Niki 2010-01-05 15:40:43

+0

如果my_state是一個枚舉或一個int,你可以在c#中。 – 2010-01-05 15:41:30

1

你可以這樣做:

enum MyEnum 
    { 
     A, B, C, D 
    } 

    // ... 
    MyEnum e = MyEnum.A; 
    if (new []{ MyEnum.A, MyEnum.B }.Contains(e)) 
     Console.WriteLine("Yeah!"); 
7

你可以使用一個擴展方法:

public static class ExtensionMethods 
{ 
    public static bool EqualsAny<T>(this T comparer, params T[] values) 
    { 
     foreach (T t in values) 
      if (comparer.Equals(t)) 
       return true; 

     return false; 
    } 
} 

,並用它喜歡:

if (myState.EqualsAny(State.CT, State.MA, State.VA, State.RI)) 
{ 
    // ... 
} 
+1

+1非常優雅。 – 2010-01-05 15:47:20

+0

這實際上並不是必須的:您已經擁有。任何()IEnumerable 。所以如果(new [] {「CT」,「MA」,「VA」,「RI」}任何(e => e == value)){}都會做同樣的事情。 – 2010-01-05 15:51:03

+1

但是你必須每次輸入新的[] {...}和lambda表達式。 – 2010-01-05 15:53:35

1

你可以寫你的自己的擴展方法來做到這一點:

static bool IsOneOf<T>(this T value, params T[] set) 
{ 
    return set.Contains(value); 
} 

用法:MY_STATE.IsOneOf(STATE_A, STATE_B, STATE_C)

(這是在運行時速度較慢,但​​。它必須創建一個臨時數組,並且必須評估IsOneOf的所有參數)

相關問題