Linq计算电影平均评分遇除零错误,如何解决?
解决Linq计算电影平均评分时的除零错误问题
嘿,这个问题我之前也碰到过!当某部电影没有任何评分记录时,你的代码里的Count()会返回0,直接触发除零错误,确实挺头疼的。不过有几个简单的办法可以解决这个问题,还能顺便优化代码的性能:
方法一:先缓存评论集合,再判断计算
这种方法的好处是只遍历一次评论集合(避免你原来代码里两次Where的重复遍历),同时明确处理无评分的情况:
// 先获取当前电影的所有评论,缓存起来 var movieReviews = reviews.Where(w => w.MovieID == m.MovieID).ToList(); // 如果有评论就计算平均值,否则返回默认值(比如0,你也可以改成null或者其他符合业务逻辑的值) var averageRating = movieReviews.Any() ? movieReviews.Average(r => r.MovieRating) : 0;
方法二:利用可空类型的Average特性
Linq的Average方法在处理空的可空数值序列时,会返回null而不是抛出异常。我们可以把评分转成可空类型,再结合空合并运算符设置默认值:
var averageRating = reviews .Where(w => w.MovieID == m.MovieID) .Select(r => (double?)r.MovieRating) // 将评分转为可空double .Average() // 空序列时返回null ?? 0; // 如果是null,就用0作为默认值
为什么你的原代码会出错?
你原来的代码两次调用Where来分别计算总和和数量,不仅会遍历两次集合(浪费性能),更关键的是当没有评论时,Count()返回0,直接触发DivideByZeroException。上面的两种方法都避免了这个问题,同时优化了查询效率。
内容的提问来源于stack exchange,提问作者sander
相关产品推荐
相关产品推荐

