如何结合||运营商在条件声明中

时间:2013-07-23 16:24:04

标签: c# .net

而不是

if (foo == "1" || foo == "5" || foo == "9" ... ) 

我喜欢将它们组合成以下(不起作用):

if (foo == ("1" || "5" || "9" ... ))

这可能吗?

8 个答案:

答案 0 :(得分:169)

不幸的是,最好的办法是创建一个扩展方法

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

你可以像这样使用它:

if (foo.IsOneOf("1", "5", "9"))
{
    ...
}

通用,它可以用于任何类型(int,string等)。

答案 1 :(得分:37)

你不能这样做。相反,你可以这样做:

string[] validValues = new string[] { "1", "5", "9", "whatever" };
if(validValues.Contains(foo))
{
    // do something
}

答案 2 :(得分:25)

一种可能的选择是:

switch (foo)
{
    case "1":
    case "5":
    case "9":
        // your code here

        break;
}

另一种可能的选择是:

var vals = new string[] { "1", "5", "9" };
if (vals.Contains(foo))
{
    // your code here
}

答案 3 :(得分:23)

如果所有选项都只是一个字符:

if ("159".IndexOf(foo) != -1)
{
  //do something
}

答案 4 :(得分:18)

这是另一种选择:

bool x = new[] { "1", "5", "9" }.Any(a => a == "5"); //x == true
bool y = new[] { "1", "5", "9" }.Any(a => a == "8"); //y == false

在这种情况下最好使用.Contains(foo),因为lambda的灵活性在这里被浪费了。如果有一个复杂的表达需要完成,Any会更有用。

答案 5 :(得分:13)

如果你可以接受的话,你可以这样做:

if ( (new string[] {"1","9","5","6" }).Contains(foo))
{

}

答案 6 :(得分:9)

您可以使用switch声明:

switch (foo) {
    case "1":
    case "5":
    case "9":
        // ...
        break;
    case "2":
    case "4":
        // ...
        break;
}

如果foo是字符串,请注意区分大小写。

答案 7 :(得分:9)

如果您有多个if条件,则应始终考虑使用switch语句,因为编译器将尽可能创建 Jumptables 以提高速度。你应该看看here进行速度测试。这里要注意的是,如果条件的数量足以覆盖开销,C#编译器也将创建一个HashTable对象。

所以这是一种更好的方法,

switch (foo) {
case "1":
case "5":
case "9":
    // ...
    break;
case "2":
case "4":
    // ...
    break;
}