You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 20:05:29