在 while 循环和 !Console.KeyAvailable C# 中嵌套 switch/case

Nested switch/case inside while loop and !Console.KeyAvailable C#

我目前正在从事一个项目,该项目利用编码器来跟踪一系列丝杠的位置。此代码块用于获取每个编码器的位置,并通过 while 循环(不按下任何键)将其显示给用户,同时还让他们可以选择将三个位置中的任何一个重置为零(通过按任一'x'、'y' 或 'z' 在键盘上。

照原样,用户需要按一次 'x' 键将 x 位置归零,按 'y' 键 2 次将 y 位置归零,'z' 键 3 次将 z 位置归零,然后键 4 次结束程序。为了使 switch/case 发生而需要按下按键的次数对应于它在案例列表中的数字位置。然而,我需要的是每个键只被按下一次来执行操作。我将如何修复 switch/case 结构(或其他任何结构)以实现这一目标?

此外,它似乎不喜欢第一个 switch 语句中的 !Console.KeyAvaible 来检查是否按下了某个键。错误是“无法将 bool 转换为 System.ConsoleKey” 还有其他表达方式吗?

while (true){
     long Position0 = encoder0.Position;
     long Position1 = encoder1.Position;
     long Position2 = encoder2.Position;
     ConsoleKeyInfo input = Console.ReadKey();
     switch (input.Key){
          case !Console.KeyAvailable:
               // initialize encoder positions and do math to convert to mm 
               float Position0f = Convert.ToSingle(Position0);
               float Position1f = Convert.ToSingle(Position1);
               float Position2f = Convert.ToSingle(Position2);
               float LinearPosition0 = Position0f / 400;
               float LinearPosition1 = Position1f / 400;
               float LinearPosition2 = Position2f / 400;

               Console.SetCursorPosition(0, 0);
               Console.WriteLine("x Position: {0:0.0000##} mm", LinearPosition0);
               Console.SetCursorPosition(0, 1);
               Console.WriteLine("y Position: {0:0.0000##} mm", LinearPosition1);
               Console.SetCursorPosition(0, 2);
               continue;

               default:
                    switch (input.Key){
                         case ConsoleKey.X:
                              Console.WriteLine("\nYou selected X!");
                              Position0 = 0;
                              break;

                         case ConsoleKey.Y:
                              Console.WriteLine("\nYou selected Y!");
                              Position1 = 0;
                              break;

                         case ConsoleKey.Z:
                              Console.WriteLine("\nYou selected Z!");
                              Position2 = 0;
                              break;

                         case ConsoleKey.Escape:
                              Console.WriteLine("\nYou selected Esc! Exiting program.");
                              break;

                         default:
                              break;
                    }
               break;
}

}

除了按键的问题外,第一个if语句中显示的位置没有变化。我应该在哪里初始化 Position0/1/2 以便它们可以在第二个 if 语句中重置为零,同时仍然在第一个循环中更新?

读取key前需要先判断key是否可用,例如:

  long Position0 = 0;
  long Position1 = 0;
  long Position2 = 0;
  bool isEnd = false;
  while ( !isEnd )
  {
    Position0 = encoder0.Position;
    Position1 = encoder1.Position;
    Position2 = encoder2.Position;
    //Position0++; Position1++; Position2++;
    float LinearPosition0 = Convert.ToSingle(Position0) / 400;
    float LinearPosition1 = Convert.ToSingle(Position1) / 400;
    float LinearPosition2 = Convert.ToSingle(Position2) / 400;
    Console.SetCursorPosition(0, 0);
    Console.WriteLine("x Position: {0:0.0000##} mm", LinearPosition0);
    Console.SetCursorPosition(0, 1);
    Console.WriteLine("y Position: {0:0.0000##} mm", LinearPosition1);
    Console.SetCursorPosition(0, 2);
    Console.WriteLine("z Position: {0:0.0000##} mm", LinearPosition2);
    if ( Console.KeyAvailable )
      switch ( Console.ReadKey(true).Key )
      {
        case ConsoleKey.X:
          Console.WriteLine("\nYou selected X!");
          Position0 = 0;
          break;
        case ConsoleKey.Y:
          Console.WriteLine("\nYou selected Y!");
          Position1 = 0;
          break;
        case ConsoleKey.Z:
          Console.WriteLine("\nYou selected Z!");
          Position2 = 0;
          break;
        case ConsoleKey.Escape:
          Console.WriteLine("\nYou selected Esc! Exiting program.");
          isEnd = true;
          break;
      }
  }

如果需要,您也可以隐藏光标。

Console.CursorVisible = false;

Animated GIF