1. 程式人生 > >C# Linq擴充套件方法應用

C# Linq擴充套件方法應用

Linq中存在大量的擴充套件方法。在System.Linq名稱空間中,存在兩個使用極其廣泛的類EnumerableQueryable,它們中就含有許許多多的擴充套件方法。擴充套件方法最重要的用途之一就是在Linq中的大量使用。本文將通過使用Enumerable中的一些擴充套件方法來完成一些簡單的例項操作,進一步瞭解擴充套件方法在Linq中的使用。

1.準備工作

建立本例需要用到的學生類,該類僅包含學號,姓名,性別,年齡,成績等屬性。程式碼如下:

class Student
{
    public int No { get; set; }
    public string Name { get; set; }
    public string Sex { get; set; }
    public int Age { get; set; }
    public float Score { get; set; }
}

建立本例所需的學生實體集合,程式碼如下:

List<Student> stuList = new List<Student>();
stuList.Add(new Student { No = 1000, Name = "王歡", Sex = "女", Age = 20, Score = 50 });
stuList.Add(new Student { No = 1001, Name = "張燕", Sex = "女", Age = 18, Score = 89 });
stuList.Add(new Student { No = 1001, Name = "於強", Sex = "男", Age = 21, Score = 34 });
stuList.Add(new Student { No = 1001, Name = "劉海", Sex = "男", Age = 18, Score = 35 });
stuList.Add(new Student { No = 1001, Name = "李晗", Sex = "男", Age = 23, Score = 87 });
stuList.Add(new Student { No = 1001, Name = "吳萌", Sex = "女", Age = 18, Score = 76 });
stuList.Add(new Student { No = 1001, Name = "羅輝", Sex = "女", Age = 18, Score = 89 });

本例使用List<T>類來建立學生實體集合,該泛型類實現了介面IEnumerable<T>IEnumerable,而Enumerable 類提供了一組用於查詢實現 IEnumerable<T> 的物件的 static(在 Visual Basic 中為 Shared)方法(msdn)”。所以本例中可以使用Enumerable 的擴充套件方法來對集合stuList進行相關操作。

2.用Where來篩選資料

要求:

        篩選出年齡不小於20歲的學生資訊,並將符合條件的學生的姓名及年齡資訊輸出介面。

實現:

    var temp1=stuList.Where(it => it.Age >= 20);
    foreach (var t in temp1)
    {
        Console.WriteLine(t.Name+t.Age);
    }

執行結果:

說明:

在Visual studio中我們檢視Where的定義,發現其定義位於Enumerable類中,所以本例項確實使用的是Enumerable類中的擴充套件方法。其函式簽名如下:

public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate);

從函式簽名可以看出:擴充套件方法Where從IEnumerable<TSource>型別的source中篩選出滿足條件predicate的結果,返回值仍為IEnumerable<TSource>型別。

3.用Select進行投影操作

要求:

         篩選出年齡不小於20歲的學生資訊,並將符合條件的學生的姓名及年齡資訊輸出介面(同前)。

實現:

     var temp2 = stuList.Where(it => it.Age >= 20)
                        .Select(x => new {name=x.Name,age=x.Age });
     foreach (var t in temp2)
     {
          Console.WriteLine(t);
     }

執行結果:

說明:

本例中使用Select方法後,產生了新的結果序列,該結果序列包含name及age兩個欄位。Where方法及Select方法的區別還是很明顯的,Where方法根據條件對集合進行篩選操作,而Select方法對集合進行投影操作得到新的結果序列。

檢視擴充套件方法Select的定義,得到其函式簽名如下:

public static IEnumerable<TResult> Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);

從函式簽名中可以進一步瞭解到Select子句的作用:該擴充套件方法從集合source中按照selector指定的規則進行投影操作得到新的集合。

4.用OrderBy進行排序

要求:

        篩選出年齡不小於20歲的學生資訊,並將符合條件的學生的姓名及年齡資訊輸出介面(同前),同時按照姓名升序對結果進行排序。

實現:

   var temp3 = stuList.Where(it => it.Age >= 20)
                      .Select(x => new { name = x.Name, age = x.Age })
                      .OrderBy(y=>y.name);
   foreach (var t in temp3)
   {
        Console.WriteLine(t);
   }

執行結果:

說明:

在本例中,使用OrderBy方法進行排序,該方法的函式簽名如下:

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector);

通過前面例子的解析,詳細這個函式前面大家可以看懂了吧。這裡就不贅述了。

5.我們將方法連結在一起

通過前面三個例子的學習,我們發現:在Linq操作中,可以將各個單獨的操作連結成一條管道,然後,資訊在這條管道中傳輸。這其實是擴充套件方法存在的原因之一,因為擴充套件方法允許將靜態方法的呼叫連結在一起。這樣做的好處是能夠以一種自然的方式將靜態方法連結起來。

總結:通過例項學習瞭解了擴充套件方法在Linq中的使用。