首页 > 解决方案 > 我需要在 LINQ C# 中找到 3 个参数的平均值

问题描述

我需要打印平均不大于 4 的人来进行代数。例如,“学校:131,姓名:BLA-BLA,平均:3,5”。这就是我尝试过的东西,但它给了我一个例外“序列不包含元素”更新:“不大于 4”

var result = students
                .OrderBy(s => s.Surname)
                .ThenBy(o => o.Initials)
                .Select(n => new
                {
                    Name = n.Surname + " " + n.Initials,
                    Class = n.Class,
                    Average = students
                        .Where(s => s.Subject == "Algebra" && n.Surname == s.Surname && n.Initials == s.Initials)
                        .Average(w => w.Mark)
                });

var students = new[]
            {
                new {Subject = "Algebra", Surname = "Jopin", Initials = "S.S", Class = 5, Mark = 2},
                new {Subject = "Algebra", Surname = "Jopin", Initials = "S.S", Class = 5, Mark = 2},
                new {Subject = "Algebra", Surname = "Jopin", Initials = "S.S", Class = 5, Mark = 3},
                new {Subject = "Geometry", Surname = "Jopin", Initials = "S.S", Class = 5, Mark = 5},
                new {Subject = "C.S", Surname = "Jopin", Initials = "S.S", Class = 5, Mark = 5},
                new {Subject = "C.S", Surname = "Jopin", Initials = "S.S", Class = 5, Mark = 5},
                new {Subject = "Algebra", Surname = "Bloom", Initials = "Q.V", Class = 2, Mark = 5},
                new {Subject = "Algebra", Surname = "Bloom", Initials = "Q.V", Class = 2, Mark = 5},
                new {Subject = "Algebra", Surname = "Bloom", Initials = "Q.V", Class = 2, Mark = 5},
                new {Subject = "Geometry", Surname = "Bloom", Initials = "Q.V", Class = 2, Mark = 5},
                new {Subject = "C.S", Surname = "Bloom", Initials = "Q.V", Class = 2, Mark = 5},
                new {Subject = "C.S", Surname = "Bloom", Initials = "Q.V", Class = 2, Mark = 5},
                new {Subject = "Geometry", Surname = "Roflov", Initials = "E.Y", Class = 1, Mark = 2},
                new {Subject = "C.S", Surname = "Roflov", Initials = "E.Y", Class = 1, Mark = 2},
                new {Subject = "C.S", Surname = "Roflov", Initials = "E.Y", Class = 1, Mark = 2},
                new {Subject = "Algebra", Surname = "Einstein", Initials = "B.H", Class = 4, Mark = 3},
                new {Subject = "Algebra", Surname = "Einstein", Initials = "B.H", Class = 4, Mark = 4},
                new {Subject = "Geometry", Surname = "Einstein", Initials = "B.H", Class = 4, Mark = 5}
            };

标签: c#.netlinq

解决方案


如果序列不包含任何元素,Average 方法可能会因 InvalidOperationException 而失败。从您的示例来看,至少对于学生“Roflow EY”来说,“代数”没有条目

像这样的东西应该做你想做的事。

var result = students
    .Where(s => s.Subject == "Algebra")
    .GroupBy(s => new{s.Surname, s.Initials, s.Class})
    .Select(g => new{ Name = g.Key.Surname + g.Key.Initials, g.Key.Class, Average = g.Average(x => x.Mark)})
    .Where(x => x.Average >= 4)
    .OrderBy(x => x.Name);

推荐阅读