而不是
if (foo == "1" || foo == "5" || foo == "9" ... )
我喜欢将它们组合成以下(不起作用):
if (foo == ("1" || "5" || "9" ... ))
这可能吗?
答案 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;
}