如何结合|| 条件语句中的操作符

代替

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

我喜欢把它们组合起来,类似于以下(不起作用):

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

那可能吗?

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

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

你可以像这样使用它:

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

作为通用的,它可以用于任何types(int,string等)。

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

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

一个可能的select是这样的:

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

另一个可能的select是:

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

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

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

这是又一个select:

 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的灵活性在这里被浪费了。 如果有一个复杂的expression需要完成,Any将会更有用。

你可以做到这一点,如果这是你可以接受的:

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

你可以使用switch语句:

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

如果foo是string,请注意区分大小写。

如果你有多个if条件,你应该总是考虑使用switch语句,因为编译器会尽可能创buildjumptables来提高速度。 你应该看看这里的速度testing。 这里需要注意的是,如果条件数量足够大以涵盖开销,C#编译器也会创build一个HashTable对象。

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

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