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

学习Struct与ArrayList:如何匹配TextBox分数并在MessageBox显示等级?

匹配分数对应等级的实现方法

嘿,很高兴能帮到你!针对你用ArrayList和struct来匹配分数等级的需求,我整理了几个实用的方法,你可以参考下:

方法一:基础foreach遍历(适合初学者理解)

这是最直观的方式,逐个遍历ArrayList里的Test实例,对比分数找到对应的等级,非常适合刚学习结构体和集合的场景:

private ArrayList allGrades = new ArrayList();
public struct Test { public int score; public string grade; }

private void btnFindGrade_Click(object sender, EventArgs e) {
    // 先做输入验证,避免非数字输入导致程序崩溃
    if (!int.TryParse(txtScore.Text, out int myScore))
    {
        MessageBox.Show("请输入有效的数字分数!");
        return;
    }

    bool isFound = false;
    foreach (Test gradeItem in allGrades)
    {
        if (gradeItem.score == myScore)
        {
            MessageBox.Show($"对应的等级是:{gradeItem.grade}");
            isFound = true;
            break; // 找到匹配项后立刻退出循环,提升效率
        }
    }

    if (!isFound)
    {
        MessageBox.Show("未找到对应分数的等级!");
    }
}

关键细节说明:

  • 用int.TryParse替代Convert.ToInt32,能安全处理非数字输入,避免程序报错
  • 找到匹配项后用break终止循环,不用遍历剩余元素,优化性能
  • 增加未匹配时的提示,让交互更友好

方法二:用LINQ简化代码(进阶方式)

如果你的项目引用了System.Linq,可以用LINQ来简化查找逻辑,代码会更简洁:

private void btnFindGrade_Click(object sender, EventArgs e) {
    if (!int.TryParse(txtScore.Text, out int myScore))
    {
        MessageBox.Show("请输入有效的数字分数!");
        return;
    }

    // 将非泛型的ArrayList转换为可查询的Test集合
    var matchedGrade = allGrades.Cast<Test>().FirstOrDefault(t => t.score == myScore);

    // 结构体是值类型,不能直接用==null判断,用EqualityComparer对比默认值
    if (!EqualityComparer<Test>.Default.Equals(matchedGrade, default(Test)))
    {
        MessageBox.Show($"对应的等级是:{matchedGrade.grade}");
    }
    else
    {
        MessageBox.Show("未找到对应分数的等级!");
    }
}

关键细节说明:

  • Cast<Test>()把非泛型的ArrayList转换为泛型集合,才能使用LINQ的查询方法
  • FirstOrDefault()会返回第一个匹配的元素,无匹配时返回结构体的默认值
  • 用EqualityComparer来判断是否找到匹配项,避免值类型的判断误区

额外小建议

  • 虽然你现在在学习ArrayList,但实际开发中更推荐用泛型集合List<Test>,它类型安全、不需要装箱拆箱,性能和代码可读性都更好
  • 可以给Test结构体添加构造函数,方便初始化元素:
public struct Test 
{ 
    public int score; 
    public string grade; 

    public Test(int score, string grade)
    {
        this.score = score;
        this.grade = grade;
    }
}

初始化时就可以这么写:allGrades.Add(new Test(90, "A"));

内容的提问来源于stack exchange,提问作者Jon C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:25:54