Reputation: 15
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
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