yield,FindAll和局部变量之间的比较

时间:2014-01-10 08:06:13

标签: c# .net oop collections yield

我想将过滤器应用于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;
                                                 }

所以,我需要知道它之间的最佳方式是什么?为什么?在哪些情况下?

3 个答案:

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