[英]Simplest way to filter value from generic List in C# using LINQ
我有两节课。 第一个是Person ,第二个是Student (继承自Person)。 我想过滤一个通用列表 ,找到所有等级高于7的 学生 。 我提出了以下解决方案:
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;
});
}
}
是否有更简单的方法来过滤此列表?
我看到的唯一改进是使用OfType
,就像这样
var result = people.OfType<Student>().Where(s => s.Grade > 7);
...而且我的语法更简单......但这是旁观者的眼睛。
这里有几种不同的方法,有一些相对的性能数字:
初始
people.Where(delegate(Person person)
{
var student = person as Student;
return student != null && student.Grade > 7m;
});
初始修改 (与初始速度相同)
people.Where(p =>
{
var student = p as Student;
return student != null && student.Grade > 7m;
});
OfType(比初始慢40-52%)
people.OfType<Student>().Where(s => s.Grade > 7m)
Foreach (比起初速度快9-16%)
var results = new List<Student>();
foreach (var person in people)
{
var student = person as Student;
if (student != null && student.Grade > 7m)
{
results.Add(student);
}
}
对于 (比初始快12-18%)
var results = new List<Student>();
for (var idxPerson = 0; idxPerson < people.Count; idxPerson++)
{
var student = people[idxPerson] as Student;
if (student != null && student.Grade > 7m)
{
results.Add(student);
}
}
当然,这些只是我机器上的性能数字,你必须测试真实世界的数据以获得实际结果,因为学生与人的分布,学生的平均成绩等会导致很多时间的变化。
people.RemoveAll(p => p.Grade <= 7);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.