Switch/If语句仅执行首个条件的技术问题求助
条件判断问题解决方案
问题1:Switch赋值结果被覆盖
问题描述
在AnswerControl.xaml.cs的AddToNotes方法中,通过switch根据按钮CommandParameter传入的字母(A-E)为Flashcard对象的Question和Answer赋值,但最终总是生效case "A"的逻辑。
问题根源
switch语句执行完成后,代码中硬编码重新给card.Question和card.Answer赋值为case "A"的内容,直接覆盖了switch的结果。
修改后代码
private async void AddToNotes(object sender, EventArgs e) { //Create the new card to save to flashcards table Flashcard card = new Flashcard(); string stem = ((Button)sender).CommandParameter.ToString(); switch (stem) { case "A": card.Question = string.Join(", ", question.QuestionMain, question.ChildA); card.Answer = string.Join(" - ", question.AnswerA, question.ExplanationA); break; case "B": card.Question = string.Join(", ", question.QuestionMain, question.ChildB); card.Answer = string.Join(" - ", question.AnswerB, question.ExplanationB); break; case "C": card.Question = string.Join(", ", question.QuestionMain, question.ChildC); card.Answer = string.Join(" - ", question.AnswerC, question.ExplanationC); break; case "D": card.Question = string.Join(", ", question.QuestionMain, question.ChildD); card.Answer = string.Join(" - ", question.AnswerD, question.ExplanationD); break; case "E": card.Question = string.Join(", ", question.QuestionMain, question.ChildE); card.Answer = string.Join(" - ", question.AnswerE, question.ExplanationE); break; } //Retrieve flashpacks then send a list object to the popup await using var context = new DataContext(); List<FlashcardPack> flashpacks = context.FlashcardPacks.ToList(); var response = await Shell.Current.ShowPopupAsync(new FlashpackControl(flashpacks)); //Convert returned object to flashcard pack object FlashcardPack selectedPack = (FlashcardPack)response; // 移除重复的硬编码赋值,保留switch的结果 card.FlashcardPackId = selectedPack.Id; card.NextDate = DateTime.Now.AddDays(4); context.Flashcards.Add(card); await context.SaveChangesAsync(); Toast.Make($"5 cards added to {card.FlashcardPack}", CommunityToolkit.Maui.Core.ToastDuration.Long, 14); }
解释
删除switch之后重复的card.Question和card.Answer赋值语句,确保switch中根据不同字母设置的内容被保留,不会被覆盖。
问题2:Bool转字符串比较不匹配
问题描述
在AnswerResponse RelayCommand中,将bool值转为string后进行相等判断,始终无法正确匹配。
问题根源
bool.ToString()的结果大小写敏感,默认输出"True"/"False"(首字母大写),如果传入的answer参数是小写的"true"/"false"或其他格式,会导致匹配失败。- 如果
Question.Answer是Nullable<bool>(可空布尔类型),直接访问Value可能在值为null时抛出异常。
解决方案1:统一字符串比较规则
修改比较逻辑,使用不区分大小写的比较方式:
[RelayCommand] void AnswerResponse(string answer) { bool isCorrect = false; if (Question.Answer.HasValue) { isCorrect = answer.Equals(Question.Answer.Value.ToString(), StringComparison.OrdinalIgnoreCase); } if (isCorrect) { AnswerResult = "Correct"; AnswerVisibility = true; } else { AnswerResult = "Wrong"; AnswerVisibility = true; } try { // 异常处理逻辑(如果需要) } catch (Exception) { throw; } finally { Count++; GetQuizQuestion(); } }
解决方案2:将字符串转为bool再比较(更可靠)
直接把传入的answer字符串转为bool类型,再和Question.Answer.Value比较,避免字符串格式问题:
[RelayCommand] void AnswerResponse(string answer) { bool isCorrect = false; if (Question.Answer.HasValue && bool.TryParse(answer, out bool userAnswer)) { isCorrect = userAnswer == Question.Answer.Value; } if (isCorrect) { AnswerResult = "Correct"; AnswerVisibility = true; } else { AnswerResult = "Wrong"; AnswerVisibility = true; } try { // 异常处理逻辑(如果需要) } catch (Exception) { throw; } finally { Count++; GetQuizQuestion(); } }
解释
- 方案1通过
StringComparison.OrdinalIgnoreCase忽略大小写,解决大小写不匹配问题,同时增加Question.Answer.HasValue检查避免空引用异常。 - 方案2使用
bool.TryParse将用户输入的字符串转为bool类型,直接比较布尔值,完全避免字符串格式带来的匹配问题,同时处理了字符串无法转为bool的边界情况。
内容的提问来源于stack exchange,提问作者Tanaka Mawere
相关产品推荐
相关产品推荐

