Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# switch语句可以有多个变量吗?_C#_Java_Php_Python_Switch Statement - Fatal编程技术网

C# switch语句可以有多个变量吗?

C# switch语句可以有多个变量吗?,c#,java,php,python,switch-statement,C#,Java,Php,Python,Switch Statement,这个问题基于所有使用开关块的语言(C++、C#PHP、Java、Python等等)。那么有可能有这样的东西吗 switch (var1, var2) case var1 = a: something break; case var2 = b: something break; case var1 = 0 ,var2 = 1 etc... 我从来没有见过一种语言允许这样做,不。当然不是在C#中。您应该使用if/else-if模式来克服这样的条件。我不能

这个问题基于所有使用开关块的语言(C++、C#PHP、Java、Python等等)。那么有可能有这样的东西吗

switch (var1, var2)
case  var1 = a:
    something
    break;
case var2 = b:
    something
    break;
case var1 = 0 ,var2 = 1
     etc...

我从来没有见过一种语言允许这样做,不。

当然不是在C#中。您应该使用if/else-if模式来克服这样的条件。我不能代表任何其他语言发言,但我99%肯定Java也不允许。谁知道那些疯狂的PHP和Python家伙允许什么呢…

不。你必须将一个变量的开关大小写嵌套在另一个变量的每个大小写中。

我认为你可以在Haskell和ML等语言中进行任意大小写匹配。请参阅。所讨论的对象仍然是单个对象,但该对象可以是包含任意数量对象的元组

链接中给出的示例如下:

describeList :: [a] -> String
describeList list = 
  case list of
   []     -> "The list was empty"
   (x:xs) -> "The list wasn't empty: the first element was " ++ show x ++
             ", and there were " ++ show (length xs) ++
             " more elements in the list."

如果你想一想,语言是不允许的,因为你可能会遇到不止一个真实的情况。

是/否

没有一种带有“switch”语句的传统语言具有这种特性。它确实存在于所谓的“模式匹配”中

C#、Java、PHP和Python不支持模式匹配(不完全确定PHP是否支持,但我不相信它支持。如果我错了,请纠正我)

下面是Haskell中的一个示例,其中确实存在模式匹配。模式匹配存在于许多函数式语言中

function 1 _ = "first parameter has a one"
function _ 1 = "second parameter is a one"
function _ _ = "I don't know what crazy number you passed in"
调用该函数时,运行时/编译器/检查它的人将查看是否可以调用第一个函数。如果可以,它将返回该值。然后它继续运行,直到它能够找到适用于给定参数的匹配项。“u”只是一种说法,“任何东西都可以在这里,我真的不在乎它是什么,所以不要将值绑定到名称”。如果我关心价值,我可以:

function 1 a = "second parameter is " ++ (show a)
现在,由于它通常是自上而下的(与switch语句不同),这更类似于if/else而不是只跳到正确位置的switch语句。这只是一个非常好看的if/else。另外,如果我对它重新排序,使最一般的情况出现在文件的顶部,其他情况将被忽略


您也可以对模板执行类似的操作,但这只在编译时起作用。

好吧,python没有switch case。

python没有switch语句。推荐的替代方案是使用链接的if/else链,这是您无论如何都应该在您的案例中使用的

另一个常见的习惯用法是使用地图。在您的例子中,您可以使用(var1,var2)的元组来匹配结果

switch = {
   (1,2): lambda: ..,
   (3,4): lambda: ...,
}
switch[(var1,var2)]
我不确定这是否常用,但至少是可能的。

允许:

PROC (b board LOC,m move) EXCEPTIONS (illegal);
DCL starting square LOC:= b (m.lin_1)(m.col_1),
arriving square LOC:= b (m.lin_2)(m.col_2);
DO WITH m;
IF starting.status=free THEN CAUSE illegal; FI;
IF arriving.status/=free THEN
IF arriving.p.kind=king THEN CAUSE illegal; FI;
FI;
CASE starting.p.kind, starting.p.color OF
   (pawn),(white):
      IF col_1 = col_2 AND (arriving.status/=free
      OR NOT (lin_2=lin_1+1 OR lin_2=lin_1+2 AND lin_2=2))
      OR (col_2=PRED (col_1) OR col_2=SUCC (col_1))
      AND arriving.status=free THEN CAUSE illegal; FI;
      IF arriving.status/=free THEN
      IF arriving.p.color=white THEN CAUSE illegal; FI; FI;
   (pawn),(black):
      IF col_1=col_2 AND (arriving.status/=free
      OR NOT (lin_2=lin_11 OR lin_2=lin_12 AND lin_1=7))
      OR (col_2=PRED (col_1) OR col_2=SUCC (col_1))
      AND arriving.status=free THEN CAUSE illegal; FI;
      IF arriving.status/=free THEN
      IF arriving.p.color=black THEN CAUSE illegal; FI; FI;
   (rook),(*):
      IF NOT ok_rook (b,m)
      THEN CAUSE illegal;
      FI;
   (bishop),(*):
      IF NOT ok_bishop (b,m)
      THEN CAUSE illegal;
      FI;
   (queen),(*):
   IF NOT ok_rook (b,m) AND NOT ok_bishop (b,m)
     THEN CAUSE illegal;
您可以在Scala(以及任何其他函数式语言,具有模式匹配机制)中执行类似的操作:


如上所述,这种模式匹配是函数式语言的典型特征。但您可以找到一些至少“混合”的功能性/OOP支持它

下面是F中的一个例子#

scala也一样

def fnc(var1: Int, var2: Int) : String = 
  (var1, var2) match { 
    case (2, _) => "something" 
    case ( _,3) => "something else"
    case (0, 1) => "etc..."
    case (a, b) => "I got " + a + " and " + b
  } 

println(fnc(0,1))

Python甚至没有switch语句:(您可以对所有函数参数进行模式匹配(因此可以匹配多个对象)。是的,但从技术上讲,这不是一个开关(haskell的例子)语句:函数中的pPattern匹配只是case语句的语法糖分。无论哪种方式,它们都更类似于if/else而不是switch语句。这实际上在函数语言(F#,ML,Haskell)中很常见要拥有这样一个功能,正如Matthew Willis所说:至少在Java中,你必须在你的案例中加入break语句,以避免处理所有案例。因此,不止一个可能是正确的。@Gilbert我并不反对你的观点,但你能举一个例子说明不止一个案例是正确的吗?很难在评论中给出答案,因为我不能格式化它,但我能想到的最简单的Java示例是int code=0;switch(code){case 0:code=1;case 1:code=2;case 2:System.out.println(“这是一个愚蠢的示例”);}。这里有一个更好的示例,大约在这页的一半:Python中switch语句的“推荐替代方案”是一个字典。
let fnc (var1, var2) =
    match (var1, var2) with
        | 2 , _ -> "something"
        | _ , 3 -> "something else"
        | 0, 1  -> "etc ... "
        | a, b -> "I got " + a.ToString() + " and " + b.ToString()

fnc(0, 1) |> printfn "%s" // prints "etc.."
def fnc(var1: Int, var2: Int) : String = 
  (var1, var2) match { 
    case (2, _) => "something" 
    case ( _,3) => "something else"
    case (0, 1) => "etc..."
    case (a, b) => "I got " + a + " and " + b
  } 

println(fnc(0,1))