Linq 學習(1) 概述


 本篇簡單回顧C#語言集合操作的變化,通過與Linq對等的面向對象的語法來認識Linq。
Linq是Language Integrated Query, 初識Linq感覺跟SQL Server的Tsql很像,可以進行語言必備的邏輯操作,也可以實現對集合的直接查詢。

Net1.X時代
C#不支持泛型,集合用元素只能爲object類型的ArrayList等。
添加、取出元素都與Object類型進行強制類型轉換,
如果是值類型要進行裝箱操作,取出元素時進行拆箱操作,影響效率,
編譯時不進行類型檢查,類型不匹配運行時可能出錯。
定義實體類:
public class Employee
{
    
private string _Name;
    
private int _Age;
    
private string _Phone;

    
public string Name
    {
        
get { return _Name; }
        
set { _Name = value; }
    }

    
public int Age
    {
        
get { return _Age; }
        
set { _Age = value; }
    }

    
public string Phone
    {
        
get { return _Phone; }
        
set { _Phone = value; }
    }

    
public Employee(string name, int age, string phone)
    {
        _Name
= name;
        _Age
= age;
        _Phone
= phone;
    }
}


初識化集合:
這進行類型轉換。
ArrayList list;
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"));

排序:
需實現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:G}{1,-5:G}{2}", "Name", "Age", "Phone");

    
foreach (object obj in list)
    {
        Employee emp
= obj as Employee;

        
if (emp != null)
        {
            Console.WriteLine(
"{0,-20:G}{1,-5:G}{2}", emp.Name, emp.Age, emp.Phone);
        }
    }
}

.NET 2.0時代
加入了泛型和匿名方法,代碼量減少,邏輯清晰了許多,編譯期間強類型檢查和去掉了強制類型轉換及裝箱、拆箱操作。
定義實體類跟.NET 1.1時代一樣。
排序選擇直接用匿名方法實現:
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;
    }
    );

輸出集合元素:
這裏去掉了強制類型轉換。
private void ShowList(IList<Employee> list)
{
    Console.WriteLine(
"{0,-20:G}{1,-5:G}{2}", "Name", "Age", "Phone");

    
foreach (Employee emp in list)
    {
        Console.WriteLine(
"{0,-20:G}{1,-5:G}{2}", emp.Name, emp.Age, emp.Phone);
    }
}


.Net 3.X時代
自動屬性、擴展方法、隱含類型、匿名類型、類型集合初識化器、Lambda表達式,有大大簡化了編程複雜度。
定義實體類:
用自動屬性。
public class Employee
{
    
public string Name { get; set; }
    
public int Age { get; set; }
    
public string Phone { get; set; }
}

初始化集合:
list = new List<Employee>
{
    
new Employee{ Name = "Zxjay", Age = 20, Phone = "010-123456" },
    
new Employee{ Name = "Andy", Age = 30, Phone = "020-123456" },
    
new Employee{ Name = "Bill", Age = 50, Phone = "010-345678" },
    
new Employee{ Name = "Lee", Age = 40, Phone = "010-234567" }
};

排序選擇:
用Lambda表達式實現:
list.Sort((Employee x, Employee y) => { return x.Name.CompareTo(y.Name); });
var listBijing
= list.FindAll(
    (Employee emp)
=> { return emp.Phone.StartsWith("010") && emp.Age < 50; });

輸出集合元素:
用擴展方法。
private void ShowList(List<Employee> list)
{
    Console.WriteLine(
"{0,-20:G}{1,-5:G}{2}", "Name", "Age", "Phone");

    list.ForEach((Employee emp)
=> Console.WriteLine("{0,-20:G}{1,-5:G}{2}", emp.Name, emp.Age, emp.Phone));
}

這些查詢大大簡化,但這些還是面向對象的方法。
Linq這樣實現排序選擇等操作:
var selectResult = from emp in list
                  
where emp.Phone.StartsWith("010") && emp.Age < 50
                   orderby emp.Name
                   select emp;

這纔是真正意義上的語言集成查詢,是不是似曾相識?跟SQL語句相似,只是把select字句放在最後。
本篇僅僅是對Linq的概述及語言內集合查詢機制的變化的概要介紹,Linq的內容將在下面的內容一步一步展開。
發佈了12 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章