C#实现last3YearsInInches方法时取最后3个元素报错求助
问题分析与代码修正
原代码的核心错误:
list.Reverse<Double>()是List的内置方法,属于**无返回值(void)**操作,它会直接修改原列表的元素顺序,无法链式调用Take(3)。Take(3)返回的是IEnumerable<double>类型的集合,不能直接赋值给double变量,类型完全不匹配。- 就算拿到了最后三个元素的集合,直接用集合除以3是无效操作,必须先计算元素总和再求平均,或者直接调用LINQ的平均方法。
修正后的高效写法:
using System.Linq; // 必须引用LINQ命名空间 public double Last3YearsInInches(List<double> list ) { if (list?.Count < 3) // 增加空判断,避免传入null时抛出异常 { return 100; } else { // 跳过前面的元素,直接取最后3个,比反转整个列表性能更优 var lastThreeElements = list.Skip(list.Count - 3); return lastThreeElements.Average(); } }
另一种反转实现的写法:
如果一定要用反转逻辑,需要使用LINQ的Reverse()方法(它会返回新的反转集合,不会修改原列表):
using System.Linq; public double Last3YearsInInches(List<double> list ) { if (list?.Count < 3) { return 100; } else { var lastThreeElements = list.AsEnumerable().Reverse().Take(3); return lastThreeElements.Average(); } }
额外说明:
- 必须添加
using System.Linq;才能使用Skip、Reverse、Take、Average这些LINQ扩展方法。 - 方法名改成了大驼峰格式(
Last3YearsInInches),符合C#的命名规范。 - 新增的
list?.Count空判断,能避免传入null列表时触发空引用异常。
内容的提问来源于stack exchange,提问作者caitlyn
相关产品推荐
相关产品推荐

