在 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;
我目前正在从事一个项目,该项目利用编码器来跟踪一系列丝杠的位置。此代码块用于获取每个编码器的位置,并通过 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;