I have two classes. The first one is Person, and the second one is Student (which inherits from Person). I want to filter a generic List and find all Students which grades are higher than 7. I came up with the following solution:
class Person
{
public string Name {get; set;}
}
class Student : Person
{
public decimal Grade {get; set;}
}
class Program
{
static void Main(string[] args)
{
List<Person> people = new List<Person>();
people.Add(new Person() {Name="John"});
people.Add(new Student() {Name="Joe", Grade=6});
people.Add(new Student() {Name="Jane", Grade=8});
people.Where(delegate (Person person) {
var student = person as Student;
return student != null && student.Grade > 7;
});
}
}
Is there a simpler way to filter this list?
Here's a few different ways of doing it, with some relative performance numbers:
Initial
Initial Modified (same speed as Initial)
OfType (40-52% SLOWER than Initial)
Foreach (9-16% faster than Initial)
For (12-18% faster than initial)
To get the performance numbers, I:
Of course, these are just performance numbers on my machine, you'll have to test on real-world data to get actual results as the distribution of Students vs. People, the average grade of the student, etc. will cause a lot of variation in the timings.
The only improvement I see is using
OfType
, like this...and my syntax is simpler... but that is in the eye of the beholder.