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

时间:2010-01-05 15:30:06

标签: c# linq

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

6 个答案:

答案 0 :(得分:13)

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

答案 1 :(得分: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)) 
{
    // ...
}

答案 2 :(得分:5)

您想使用映射到SQL IN的Contains。我假设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 ) );

答案 3 :(得分:2)

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

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

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

答案 4 :(得分:1)

您可以执行以下操作:

    enum MyEnum
    {
        A, B, C, D
    }

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

答案 5 :(得分: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的所有参数)