C#搜索交错数组并统计符合指定范围的decimal元素数量问题
问题排查与修复
核心错误原因
你原本设想的if (arrayToSearch[i] >= ranges[j][0] && arrayToSearch[i] <= ranges[j][1])判断逻辑本身是正确的,代码异常和逻辑错误来自两个问题:
- 多余的第三层循环触发索引越界:你已经明确每个范围子数组固定存储2个decimal,分别是区间下界(索引0)和上界(索引1),但额外嵌套了
for (int n = 0; n < ranges[j].Length; n++)循环,当n=1时访问ranges[j][n + 1]等价于访问索引2,超出了长度为2的数组的索引范围,直接触发IndexOutOfRangeException异常。 - 存在重复计数风险:如果一个元素同时落在多个重叠范围内,原有逻辑会多次统计该元素,若需求是「元素只要落在任意一个范围就算1次」,需要在匹配到对应范围后提前跳出循环避免重复计数。
修复后的代码
public static int GetDecimalsCount(decimal[] arrayToSearch, decimal[][] ranges) { if (arrayToSearch is null) { throw new ArgumentNullException(nameof(arrayToSearch)); } if (ranges is null) { throw new ArgumentNullException(nameof(ranges)); } int sum = 0; foreach (decimal num in arrayToSearch) { bool isInRange = false; foreach (decimal[] range in ranges) { // 追加防御判断,避免非法格式的范围子数组引发异常 if (range.Length < 2) continue; if (num >= range[0] && num <= range[1]) { isInRange = true; break; // 匹配到任意范围就跳出,避免重复计数 } } if (isInRange) sum++; } return sum; }
验证说明
修复后你的两个测试用例可正常通过:
- 单范围
[0.1, 0.2]测试:匹配0.1、0.2两个元素,返回2,符合预期。 - 双范围
[0.1,0.2]、[0.4,0.5]测试:匹配0.1、0.2、0.4、0.5四个元素,返回4,符合预期。
内容的提问来源于stack exchange,提问作者Linascts
相关产品推荐
相关产品推荐

