我可以在C#中使用linq压缩if语句吗?

在sql中,我可以创建一个if语句,如下所示如果MY_STATE在(1,2,3,4)

在C#中我必须输入if(MY_STATE == STATE.CT || MY_STATE == STATE.MA || MY_STATE == STATE.VA || MY_STATE == STATE.RI)

这显然更笨重。 我可以使用LINQ来模仿sql的“in”语句吗?

我正在寻找像if(MY_STATE in(STATE.CT,STATE.MA,STATE.VA,STATE.RI))之类的东西

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

您可以使用扩展方法:

 public static class ExtensionMethods { public static bool EqualsAny(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)) { // ... } 

您想使用Contains,它映射到SQL IN。 我假设State是一个枚举并存储为整数。

 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 ) ); 

在c ++中我会使用switch语句。

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

刚从记忆中记下来。 所以你可能会纠正一些语法问题。

你可以这样做:

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

您可以编写自己的扩展方法来执行此操作:

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

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

(但它在运行时速度较慢。它必须创建一个临时数组,并且必须评估IsOneOf的所有参数)