我可以有这样的if语句吗?如果Test ="test1"或"test2"或"test3"而没有走很长的路?

MrM*_*MrM 9 c#

我必须将我的if语句设置为

if(Test == "test1" || Test == "test2" || Test == "test3")
{
    //do something
}
Run Code Online (Sandbox Code Playgroud)

有没有办法有类似的东西

if(Test == "test1":"test2":"test3")
Run Code Online (Sandbox Code Playgroud)

SLa*_*aks 17

是.

if (new [] { "test1", "test2", "test3" }.Contains(Test))
Run Code Online (Sandbox Code Playgroud)

你甚至可以写一个扩展方法:

public static bool IsAnyOf<T>(this T obj, params T[] values) { 
    return values.Contains(T); 
}

if (Test.IsAnyOf("test1", "test2", "test3"))
Run Code Online (Sandbox Code Playgroud)

为获得最佳性能,您可以进行带有两个或三个参数但不使用数组的重载.


Dan*_*son 17

您编写的代码没有任何问题.这很容易理解,但您可以尝试:

switch (Test)
{
   case "test1":
   case "test2":
   case "test3":
      //your code here
      break;
   default :
      //else code
      break;
 }
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,这比你原来的if语句要冗长得多,而且不是很明显它的用途,但它是各种各样的答案.它将编译为非常有效的中间代码.实际上,如果要相信这篇文章,那么它可以编译为比帖子中的if语句更高效的代码,具体取决于编译器是否将这些值视为"相邻".

  • +1不使用`包含'..谈论教导坏习惯; 啧. (4认同)
  • 为此它是.取决于真正的价值(可能不是"test1","test2","test3")以及OP期望在未来添加的内容.该数组可以是"private static readonly". (2认同)
  • 在这种情况下,您应该编辑您的问题或更改您接受的答案.否则,遇到这种情况的用户将被错误地认为加入的答案对他们来说是更好的答案. (2认同)

Ron*_*erg 5

你可以做些什么来缩短你的陈述如下:

if (new[] { "test1", "test2", "test2" }.Contains(Test))
{
    ...
}
Run Code Online (Sandbox Code Playgroud)