首页 > 解决方案 > 如果没有记录,如何避免 .Average 在 LINQ 表达式中引发异常?

问题描述

这是我的 LINQ 查询:

 var t2 = t1.GroupBy(x => x.DateYYMMDD)
            .OrderBy(g => g.Key)
            .Select(g => new ScreenTimeModel
            {
                 DateYYMMDD = $"20{g.Key.Substring(0, 2)}/{g.Key.Substring(2, 2)}/{g.Key.Substring(4, 2)}",
                 LearnTimeAvg = (int)g.Where(gx => gx.Mode == 2).Average(gi => gi.ScreenSeconds)
            }).ToList();

在没有记录会议的情况下会出现问题Mode == 2

在这种情况下,有没有一种方法可以默认LearntTimeAvg为 0,因为目前它会引发异常并且没有创建列表?

标签: c#.netlinq

解决方案


您可以使用DefaultIfEmpty方法:

g.Where(gx => gx.Mode == 2).DefaultIfEmpty().Average(gi => gi.ScreenSeconds)

它的用法是:

返回 IEnumerable 的元素,如果序列为空,则返回默认值的单例集合。


推荐阅读