首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

LINQ 學習筆記(一)綜述(二):.NET 1.x 到 2.0 的集合操作演進

     編輯:關於C語言

.NET 1.x 時代:ArrayList 與裝箱/拆箱之痛

集合初始化


ArrayList list = new ArrayList();
list.Add(new Employee("Zxjay", 20, "010-123456"));
list.Add(new Employee("Andy", 30, "020-123456"));
list.Add(new Employee("Bill", 50, "010-3456789"));
list.Add(new Employee("Lee", 40, "0532-234567"));

所有元素視為 object,存入值型別需裝箱,取出需拆箱並強制轉型,效能損耗大且無編譯期型別安全。

排序:實作 IComparer


class SortArrayList : IComparer
{
    public int Compare(object x, object y)
    {
        Employee a = x as Employee;
        Employee b = y as Employee;
        return a.Name.CompareTo(b.Name);
    }
}
list.Sort(new SortArrayList());

篩選:手動迴圈與型別轉換


ArrayList selectedList = new ArrayList();
foreach (object obj in list)
{
    Employee emp = obj as Employee;
    if (emp != null && emp.Phone.StartsWith("010") && emp.Age < 50)
    {
        selectedList.Add(emp);
    }
}

輸出:重複的型別檢查與轉換


private void ShowList(ArrayList list)
{
    Console.WriteLine("{0,-20}{1,-5}{2}", "Name", "Age", "Phone");
    foreach (object obj in list)
    {
        Employee emp = obj as Employee;
        if (emp != null)
        {
            Console.WriteLine("{0,-20}{1,-5}{2}", emp.Name, emp.Age, emp.Phone);
        }
    }
}

.NET 2.0 時代:泛型與匿名方法的救贖

  • 泛型:List<Employee> 移除裝箱/拆箱,編譯期強型別檢查
  • 匿名方法:delegate(Employee x, Employee y) { ... } 簡化排序/篩選邏輯傳遞

排序與篩選:匿名方法


list.Sort(delegate(Employee x, Employee y) { return x.Name.CompareTo(y.Name); });

List<Employee> listBeijing = list.FindAll(
    delegate(Employee emp) { return emp.Phone.StartsWith("010") && emp.Age < 50; }
);

輸出:foreach 直接存取強型別元素


private void ShowList(IList<Employee> list)
{
    Console.WriteLine("{0,-20}{1,-5}{2}", "Name", "Age", "Phone");
    foreach (Employee emp in list)
    {
        Console.WriteLine("{0,-20}{1,-5}{2}", emp.Name, emp.Age, emp.Phone);
    }
}

演進總結

時代集合型別型別安全排序/篩選語法效能
.NET 1.xArrayList無(運行時檢查)IComparer + 手動迴圈裝箱/拆箱開銷大
.NET 2.0List<T>編譯期強型別匿名方法無裝箱,效能大幅提升
.NET 3.5List<T> + LINQ編譯期強型別 + IntelliSenseLambda + 查詢語法同 2.0,開發效率最高

結語

從 ArrayList 到 List<T>,再到 LINQ,每一次演進都在解決前一代的痛點:型別安全、程式碼冗長、可讀性。理解這段歷史,有助於體會 LINQ 設計初衷與優雅之處。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved