学习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
相关产品推荐
相关产品推荐

