我想将过滤器应用于Student
个对象列表。我找到了三种方法:
第一种方式
使用FindAll
List<Student> liste = Admin.GetStudentList().FindAll(x => x.Age > 20);
第二种方式
使用yield
关键字
public List<Student> GetStudentListByAge(int age){
foreach(Student s in Admin.GetStudentList()){
if(s.Age > age) yield return s;
}
}
第三种方式
使用本地列表:
public List<Student> GetStudentListByAge(int age){
List<Student> list2 = new List<Student>();
foreach(Student s in Admin.GetStudentList()){
if(s.Age > age) list2.Add(s);
}
return list2;
}
所以,我需要知道它之间的最佳方式是什么?为什么?在哪些情况下?
答案 0 :(得分:3)
第一个是内部实施的第三个。第二个不会返回List<Student>
而是IEnumerable<Student>
。
我个人会使用 LINQ 之类的:
Admin.GetStudentList().Where(x => x.Age > 20).ToList()
它很短,如果将来GetStudentList()
返回IQueryable<Student>
,您将无需重写此代码,而且它将比其他代码更有效。
答案 1 :(得分:1)
第二种方式是最好的,因为它使用产量而且更普遍。这正是LINQ对象中Where
的实现方式。所以真正的答案是使用LINQ:
IEnumerable<Student> studentsByAge = Admin.GetStudentList().Where(x => x.Age > 20);
P.S:FindAll
在这种情况下表现也不错,但它属于list,这意味着如果你将类型更改为另一个集合,你也必须改变它。
答案 2 :(得分:0)
更具可读性,可移植且代码更少。 女巫是linq提供的方法,如“All”,“Where”,......
students.Where(s => s.FirstName == "s");
students.All(s => s.Age > 10);