invis
invis

Reputation: 15

I need to find the average with the 3 parameters in LINQ C#

I need to print the people with average not greater than 4 for algebra. For example, "SCHOOL: 131, NAME: BLA-BLA, AVERAGE: 3,5". Thats the thing i've tried but it gave me an exception "sequence contains no elements" upd: "not greater than 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}
            };

Upvotes: 1

Views: 62

Answers (1)

treze
treze

Reputation: 3299

The Average method can fail with InvalidOperationException if the sequence contains no elements. From your example, it looks like at least for student "Roflow E.Y" there is no entry for "Algebra"

Something like this should do what you want.

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);

Upvotes: 2

Related Questions