foreach循环输入不同却返回相同值:ArrayList与struct成绩匹配异常求助
嘿,我来帮你揪出这个bug!这种分数对应等级的逻辑出错很常见,咱们从几个最可能的方向一步步排查:
1. 区间判断顺序搞反了,被低等级条件提前拦截
这是最常见的原因!比如你如果是先判断「分数≤60返回F」,那399肯定满足这个条件,直接返回F,根本轮不到C的判断逻辑。
正确的做法应该是从高到低匹配区间:先检查是否符合最高等级的条件,再依次往下匹配低等级,最后剩下的才返回F。如果顺序反过来,高分数会被低等级的条件先命中,直接返回错误结果。
2. Struct的区间数值设置错误
检查你定义的struct实例,对应C等级的数值是不是写错了?比如你本来想让C对应300-399,但把最大值设成了299,或者最小值设成了400?这样399自然匹配不到C的区间,最后落到F里。
举个struct定义的例子:
public struct GradeLevel { public int MinScore; public int MaxScore; public char Letter; }
那C对应的实例应该是 new GradeLevel { MinScore = 300, MaxScore = 399, Letter = 'C' },数值一旦写错,匹配逻辑就完全失效了。
3. Foreach循环的条件写反了
仔细看你的判断条件:是不是把「≥」写成了「≤」,或者把「≤」写成了「≥」?比如本来应该判断inputScore >= grade.MinScore && inputScore <= grade.MaxScore,结果写成了inputScore <= grade.MinScore || inputScore >= grade.MaxScore。那399自然不会匹配到任何等级,最后返回默认的F。
另外,还要检查你的ArrayList元素顺序:如果是按F、D、C、B、A的顺序存的,那foreach会先检查F的条件,一旦满足就返回,高分数也会被错误拦截。
4. 示例代码参考
给你一个适配你需求的实现思路,你可以对照自己的代码调整:
// 定义struct public struct GradeRange { public int MinScore; public int MaxScore; public char LetterGrade; } // 初始化ArrayList(按等级从高到低排列) ArrayList gradeList = new ArrayList(); gradeList.Add(new GradeRange { MinScore = 400, MaxScore = 500, LetterGrade = 'A' }); gradeList.Add(new GradeRange { MinScore = 300, MaxScore = 399, LetterGrade = 'C' }); gradeList.Add(new GradeRange { MinScore = 0, MaxScore = 299, LetterGrade = 'F' }); // 这里可以补充B、D等其他等级的规则 // 匹配分数的方法 char GetLetterGrade(int inputScore) { foreach (GradeRange grade in gradeList) { if (inputScore >= grade.MinScore && inputScore <= grade.MaxScore) { return grade.LetterGrade; } } return 'F'; // 兜底返回 }
用这个逻辑的话,输入399会正确匹配到C的区间。
如果还是找不到问题,把你的struct定义、ArrayList初始化代码和foreach循环的代码贴出来,我帮你精准定位!
内容的提问来源于stack exchange,提问作者Zac Beatty-Taylor

