C#中如何使用Generic计算高于和低于平均值的分数
问题分析
你现有代码存在以下核心问题:
- 声明的泛型参数
<A,B,C,D,E>完全未使用,参数类型硬编码为int、double,不符合题目要求的「支持任意类型分数」的要求 - 没有实现高于/低于平均值的分数统计、输出逻辑
- Program类嵌套在Calculator类中,结构不合理
- high、low成员变量未赋值,也无法在外部直接访问
实现思路
要支持任意数值类型的分数,我们可以给泛型参数添加IConvertible接口约束,将不同类型的分数统一转换为double类型参与计算,同时存储原始分数用于后续展示。
修正后完整代码
using System; using System.Collections.Generic; namespace oopGeneric { class Calculator { // 存储高于、低于平均值的分数,以及最终平均值 public List<object> HigherThanAvg { get; private set; } = new List<object>(); public List<object> LowerThanAvg { get; private set; } = new List<object>(); public double Average { get; private set; } // 泛型方法,约束参数为可转换类型,支持任意数值类型输入 public void Calculate<T1, T2, T3, T4, T5>(T1 score1, T2 score2, T3 score3, T4 score4, T5 score5) where T1 : IConvertible where T2 : IConvertible where T3 : IConvertible where T4 : IConvertible where T5 : IConvertible { // 统一转double计算总和 double s1 = score1.ToDouble(null); double s2 = score2.ToDouble(null); double s3 = score3.ToDouble(null); double s4 = score4.ToDouble(null); double s5 = score5.ToDouble(null); double sum = s1 + s2 + s3 + s4 + s5; Average = sum / 5; Console.WriteLine($"总和:{sum},平均值:{Average:F2}"); // 逐个判断高低,存储原始分数 CheckScore(score1, s1); CheckScore(score2, s2); CheckScore(score3, s3); CheckScore(score4, s4); CheckScore(score5, s5); // 打印结果 Console.WriteLine("高于平均值的分数:" + string.Join("、", HigherThanAvg)); Console.WriteLine("低于平均值的分数:" + string.Join("、", LowerThanAvg)); } private void CheckScore<T>(T originalScore, double num) where T : IConvertible { if (num > Average) { HigherThanAvg.Add(originalScore); } else if (num < Average) { LowerThanAvg.Add(originalScore); } // 等于平均值的不计入高低统计,可根据需求调整 } } class Program { static void Main(string[] args) { Calculator calc = new Calculator(); // 可传入任意数值类型组合,不需要手动指定泛型类型,编译器会自动推断 calc.Calculate(5, 5.5, 15.0, 6, 8); } } }
运行结果示例
总和:39.5,平均值:7.90 高于平均值的分数:15、8 低于平均值的分数:5、5.5、6
内容的提问来源于stack exchange,提问作者Aldeek
相关产品推荐
相关产品推荐

