77

代替

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

我喜欢将它们组合起来类似于以下内容(这不起作用):

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

那可能吗?

4

8 回答 8

169

不幸的是,你最好的选择是创建一个扩展方法

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

你可以像这样使用它:

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

作为泛型,它可以用于任何类型(int、string 等)。

于 2013-07-23T16:27:58.343 回答
37

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

string[] validValues = new string[] { "1", "5", "9", "whatever" };
if(validValues.Contains(foo))
{
    // do something
}
于 2013-07-23T16:25:28.887 回答
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
}
于 2013-07-23T16:25:17.300 回答
23

如果所有选项都只是一个字符,您可以这样做:

if ("159".IndexOf(foo) != -1)
{
  //do something
}
于 2013-07-23T16:31:33.750 回答
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 会更有用。

于 2013-07-23T16:28:46.257 回答
13

如果您可以接受,您可以这样做:

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

}
于 2013-07-23T16:25:24.280 回答
9

您可以使用以下switch语句:

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

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

于 2013-07-23T16:25:32.477 回答
9

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

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

switch (foo) {
case "1":
case "5":
case "9":
    // ...
    break;
case "2":
case "4":
    // ...
    break;
}
于 2013-07-23T16:31:04.643 回答