如何在C#循环中使用Switch语句?代码问题排查求助
问题解决:循环中Switch语句无法正常执行的原因及修复方案
核心问题分析
你的代码存在两个关键逻辑错误,导致Switch语句无法正常触发:
- 重复读取输入:连续调用两次
Console.ReadLine(),第一次输入存入instruments,第二次存入action,后续的if (action == instruments)判断要求你连续输入两次完全相同的内容才会执行Switch,这和“输入一次乐器名返回信息”的需求完全不符。 - 退出逻辑错位:只有当第二次输入为"Quit"时才会退出程序,不符合用户“输入一次即可完成操作”的预期。
修复方案
基础修复版(保留原有Switch结构)
只读取一次输入,移除多余的判断逻辑,直接基于输入值执行Switch或退出操作:
static void Main(string[] args) { var repeat = true; while(repeat) { Console.WriteLine("Hello. Which instrument would you like to review? Type Quit to exit the program."); // 仅读取一次用户输入 string input = Console.ReadLine(); // 优先处理退出逻辑 if (input.Equals("Quit", StringComparison.OrdinalIgnoreCase)) { repeat = false; continue; } // 直接使用输入值执行Switch switch (input) { case "Jazzmaster": string jazzmasterMake = "Fender"; string jazzmasterModel = "Jazzmaster"; string jazzmasterType = "guitar"; string jazzmasterCountry = "Japan"; int jazzmasterYear = 1997; string jazzmasterSerial = "A019459"; string jazzmasterColor = "Sunburst"; Console.WriteLine($"Your {jazzmasterMake} {jazzmasterModel} is a {jazzmasterType} made in {jazzmasterCountry} in {jazzmasterYear} in a {jazzmasterColor} color and with a serial number of {jazzmasterSerial}."); break; case "Jaguar": string jaguarMake = "Fender"; string jaguarModel = "Jaguar"; string jaguarType = "guitar"; string jaguarCountry = "Japan"; int jaguarYear = 1997; string jaguarSerial = "A035931"; string jaguarColor = "White"; Console.WriteLine($"Your {jaguarMake} {jaguarModel} is a {jaguarType} made in {jaguarCountry} in {jaguarYear} in a {jaguarColor} color and with a serial number of {jaguarSerial}."); break; case "Stratocaster": string stratocasterMake = "Fender"; string stratocasterModel = "Stratocaster"; string stratocasterType = "guitar"; string stratocasterCounty = "USA"; int stratocasterYear = 2018; string stratocasterSerial = "US18004688"; string stratocasterColor = "Black"; Console.WriteLine($"Your {stratocasterMake} {stratocasterModel} is a {stratocasterType} made in {stratocasterCounty} in {stratocasterYear} in a {stratocasterColor} color and with a serial number of {stratocasterSerial}."); break; default: Console.WriteLine("That instrument is not in your collection."); break; } } }
优化版(用类封装数据,简化代码)
通过定义乐器类和字典存储数据,减少重复代码,同时支持大小写不敏感的输入匹配:
// 封装乐器数据的类 public class Instrument { public string Make { get; set; } public string Model { get; set; } public string Type { get; set; } public string Country { get; set; } public int Year { get; set; } public string Serial { get; set; } public string Color { get; set; } } static void Main(string[] args) { // 初始化乐器集合,支持大小写不敏感匹配 var instrumentCollection = new Dictionary<string, Instrument>(StringComparer.OrdinalIgnoreCase) { ["Jazzmaster"] = new Instrument { Make = "Fender", Model = "Jazzmaster", Type = "guitar", Country = "Japan", Year = 1997, Serial = "A019459", Color = "Sunburst" }, ["Jaguar"] = new Instrument { Make = "Fender", Model = "Jaguar", Type = "guitar", Country = "Japan", Year = 1997, Serial = "A035931", Color = "White" }, ["Stratocaster"] = new Instrument { Make = "Fender", Model = "Stratocaster", Type = "guitar", Country = "USA", Year = 2018, Serial = "US18004688", Color = "Black" } }; var repeat = true; while(repeat) { Console.WriteLine("Hello. Which instrument would you like to review? Type Quit to exit the program."); string input = Console.ReadLine(); if (input.Equals("Quit", StringComparison.OrdinalIgnoreCase)) { repeat = false; continue; } // 从集合中查找乐器 if (instrumentCollection.TryGetValue(input, out var instrument)) { Console.WriteLine($"Your {instrument.Make} {instrument.Model} is a {instrument.Type} made in {instrument.Country} in {instrument.Year} in a {instrument.Color} color and with a serial number of {instrument.Serial}."); } else { Console.WriteLine("That instrument is not in your collection."); } } }
内容的提问来源于stack exchange,提问作者Nick
相关产品推荐
相关产品推荐

