【问题标题】:Comparison between yield , FindAll and local variableyield , FindAll 和局部变量之间的比较
【发布时间】:2014-01-29 02:42:08
【问题描述】:

我想对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;
                                                 }

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

【问题讨论】:

  • 为什么不使用来自 LINQ 的Where
  • 是的,这是另一种可能性。所以我需要哪个是最好的
  • 最好怎么做?最快的?最易读?最不可能失败?您的要求是什么?您是否进行过任何测试和试验,以确定哪一种最适合您?
  • @Default : 我需要知道哪个是最快的,即如果列表的元素数量很大,哪个是最快给出结果的?

标签: c# .net oop collections yield


【解决方案1】:

第二种方式是最好的,因为它使用yield并且更通用。这正是Where 在 LINQ to 对象中的实现方式。所以真正的答案是使用 LINQ:

IEnumerable<Student> studentsByAge = Admin.GetStudentList().Where(x => x.Age > 20);

P.S:FindAll 在这种情况下也会表现良好,但它属于列表,这意味着如果您将类型更改为另一个集合,您也必须更改它。

【讨论】:

  • 它不像Where那样完全 ... Where不接受一个int而是一个谓词作为参数。
【解决方案2】:

在这种情况下,可读性更强、可移植且代码更少。 巫婆是 linq 提供的方法,例如“All”,“Where”,...

        students.Where(s => s.FirstName == "s");
        students.All(s => s.Age > 10);

【讨论】:

    【解决方案3】:

    第一个在内部实现为第三个。第二个不会返回List&lt;Student&gt;,而是IEnumerable&lt;Student&gt;

    我个人会使用 LINQ,例如:

    Admin.GetStudentList().Where(x =&gt; x.Age &gt; 20).ToList()

    很短,如果将来GetStudentList()返回IQueryable&lt;Student&gt;,你就不需要重写这段代码,而且它会比其他的更高效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-19
      • 2022-06-16
      • 2023-03-23
      • 2015-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多