.NET 2.0 引入泛型 List<T> 後取代 ArrayList,搭配 .NET 3.5 的 LINQ,集合操作方式多元化。本文實測 10 萬筆 Person 資料,比較三種搜尋與兩種排序方式的效能差異。
public class Person { public string FirstName { get; set; } public string LastName { get; set; } public int ID { get; set; } }
List<Person> list = new List<Person>();
for (int i = 0; i < 100001; i++) list.Add(new Person { FirstName = i + "FirstName", LastName = i + "LastName", ID = i });
| 方法 | 程式碼關鍵 | 耗時 (ms) |
|---|---|---|
| FindAll + Predicate | list.FindAll(p => p.ID >= 50000) | 5 |
| 傳統 For 迴圈 | for(...) if(list[i].ID >= 50000) result.Add(list[i]) | 4 |
| LINQ Where + ToList | (from m in list where m.ID >= 50000 select m).ToList() | 6 |
結果顯示:For 迴圈最快,FindAll 次之,LINQ 最慢(差距極小)。FindAll 優在查詢邏輯可封裝於獨立類別,利於維護;LINQ 靈活度高但查詢效能稍遜。
| 方法 | 程式碼關鍵 | 耗時 (ms) |
|---|---|---|
| List.Sort + IComparer | list.Sort(new PersonComparer()) | 670 |
| LINQ OrderByDescending + ToList | (from m in list orderby m.ID descending select m).ToList() | 195 |
驚人發現:LINQ 排序效能大幅優於 List.Sort(約 3.4 倍)。推測 LINQ 內部優化或延遲執行機制帶來優勢。
待解疑問:為何 For 迴圈搜尋最快?LINQ 排序為何大幅領先?歡迎高手指教。