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

dia*_*dem 4 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))之类的东西

Ben*_*zun 13

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

  • 更差.Switch和if语句基本上是比较和跳转.这是创建一个数组并进行循环,比较,中断.这有关系吗?取决于你的用例.测量它:) (2认同)

Cal*_*ers 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它像:

if (myState.EqualsAny(State.CT, State.MA, State.VA, State.RI)) 
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)


tva*_*son 5

您想使用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 ) );
Run Code Online (Sandbox Code Playgroud)

  • 你速度更快;-)我不喜欢int cast,但那可能只是我. (5认同)