67

有没有更短的方法来写这样的东西:

if(x==1 || x==2 || x==3) // do something

我正在寻找的是这样的:

if(x.in((1,2,3)) // do something
4

7 回答 7

72

您可以通过使用List.Contains方法来实现这一点:

if(new []{1, 2, 3}.Contains(x))
{
    //x is either 1 or 2 or 3
}
于 2013-05-31T21:22:46.673 回答
39
public static bool In<T>(this T x, params T[] set)
{
    return set.Contains(x);
}

...

if (x.In(1, 2, 3)) 
{ ... }

必读: MSDN 扩展方法

于 2013-05-31T21:23:12.517 回答
14

如果它在一个IEnumerable<T>,使用这个:

if (enumerable.Any(n => n == value)) //whatever

否则,这是一个简短的扩展方法:

public static bool In<T>(this T value, params T[] input)
{
    return input.Any(n => object.Equals(n, value));
} 

把它放在一个static class中,你可以像这样使用它:

if (x.In(1,2,3)) //whatever
于 2013-05-31T21:23:55.077 回答
2
int x = 1;
if((new List<int> {1, 2, 3}).Contains(x))
{
}
于 2013-05-31T21:24:32.650 回答
0

我完全在这里猜测,如果我错了,请更正代码:

(new int[]{1,2,3}).IndexOf(x)>-1
于 2013-05-31T21:22:53.977 回答
-4

您可以创建一个简单Dictionary<TKey, TValue>的用作该问题的决策表

        //Create your decision-table Dictionary
        Action actionToPerform1 = () => Console.WriteLine("The number is okay");
        Action actionToPerform2 = () => Console.WriteLine("The number is not okay");
        var decisionTable = new Dictionary<int, Action>
            {
                {1, actionToPerform1},
                {2, actionToPerform1},
                {3, actionToPerform1},
                {4, actionToPerform2},
                {5, actionToPerform2},
                {6, actionToPerform2}
            };

        //According to the given number, the right *Action* will be called.
        int theNumberToTest = 3;
        decisionTable[theNumberToTest](); //actionToPerform1 will be called in that case.

一旦你初始化了你的Dictionary,剩下要做的就是:

decisionTable[theNumberToTest]();

于 2013-05-31T21:58:57.960 回答
-4

这个答案指的是 C# 的可能未来版本;-) 如果您考虑切换到 Visual Basic,或者如果 Microsoft 最终决定将 Select Case 语句引入 C#,它将如下所示:

Select Case X
    Case 1, 2, 3
    ...
End Select
于 2016-01-27T09:47:50.100 回答