2014-01-10 21 views
1

我想對Student對象列表應用篩選器。我發現三種方式來做到這一點:收益率,FindAll和局部變量之間的比較

第一種方式

通過使用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; 
               } 

所以,我需要知道什麼是它的最佳方法是什麼?爲什麼?在哪些情況下?

+5

爲什麼不使用LINQ的'Where'? – wudzik

+0

是的,這是另一種可能性。所以我需要哪一個是最好的 –

+1

最好的?最快的?最可讀?最不可能失敗?你的要求是什麼,你是否做過任何測試和試驗以找出哪一個最適合你? – Default

回答

3

第一個是內部實現。第二個不會返回List<Student>,而是IEnumerable<Student>

我個人會用LINQ,如:

Admin.GetStudentList().Where(x => x.Age > 20).ToList()

這是短期,如果GetStudentList()在未來的回報IQueryable<Student>,你會不會需要重寫這段代碼,而且會更比其他人高效。

1

第二種方法是最好的,因爲它使用良率,它更一般。這正是Where在LINQ to objects中的實現方式。所以,真正的答案是使用LINQ:

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

PS:FindAll也將在這種情況下表現良好,但它屬於列表,這意味着,如果你改變到另一種收集你就必須改變太。

+0

它不*完全*喜歡'Where' ...''哪裏'不接受一個int,而是一個謂詞作爲參數。 – Default

0

在這種情況下,可讀性更高,可移植性更高,代碼更少。 女巫是如「全部」,「去哪兒」通過LINQ提供的方法,...作爲第三個

 students.Where(s => s.FirstName == "s"); 
     students.All(s => s.Age > 10); 
相關問題