Lambda表達式介紹


Lambda表達式實際上是一個匿名函數。它包含表達式和語句,常用於創建委托或表達式目錄樹類型。所有Lambda表達式都是用Lambda運算符----------  =>,該運算符讀為“goesto”。Lambda運算符的左邊是輸入參數(可能沒有),右邊是表達式或語句塊。Lambda表達式返回右邊表達式的結果。其基本格式如下:

(input paramenters)=>expression

其中,parameters是一個參數列表,在Lambda只有一個輸入參數時可以不適用括號,否則括號是必須的。兩個或更多輸入參數由括在括號中的逗號分隔,如以下代碼所示,包括兩個參數x和y。

(x,y)=> x==y

通常Lambda表達式的參數都是可變類型的,由編譯器自動確定它的具體類型。但有時編譯器難於或無法推斷輸入類型,就需要為參數顯示指定類型,既在參數之前添加參數類型。如下所示的Lambda表達式包括連個參數x和s。其中x是int類型,而s則是string類型。

(int x, string s) =>s.Length > x

當Lanbda表達式沒有參數時,需要使用空的括號表示,如下所示。其中,“()”表示沒有參數,而Amethod()是一個具體的方法,該方法的返回值就是Lambda表達式的結果。

() => AMethod()

由於Lambda表達式實際是匿名函數,它可以賦值到一個委托,而在IEnumerable<T>的方法中很多都通過函數委托來實現自定義的運算、條件等操作,所以Lambda表達式在Linq中被廣泛使用。
常用實例:

1.用Where()方法進行篩選

using System; using System.Linq;

namespace ConsoleApplication3 {     class Program     {          static void Main(string[] args)         {             int[] intary = { 1,  2, 3, 4, 5, 6, 7, 8, 89, 10 };             //查詢所有能被2整除的元素             var  query1 = intary.Where(num => num % 2 == 0);              Console.WriteLine("Query1:");             foreach (var item in  query1)             {                 Console.WriteLine("{0}",  item);             }

            //查詢所有值大於3被索引的元素             var query2 = intary.Where((num,  index) => num > index * 3);              Console.WriteLine("Query2:");             foreach (var item in  query2)             {                 Console.WriteLine("{0}",  item);             }         }     } }

2.用OrderBy()方法進行排序

using System; using System.Linq;

namespace ConsoleApplication3 {     class Program     {          static void Main(string[] args)         {             int[] intary = { 1,  2, 3, 4, 5, 6, 7, 8, 89, 10 };              //對所有元素按照%10進行升序排列,這是默認的排序方式             var query1 = intary.OrderBy(val  => val % 10 );             Console.WriteLine("Query1:");              foreach (var item in query1)             {                  Console.WriteLine("{0}", item);             }

            //對所有元素按照%10進行降序排列             var query2 =  intary.OrderByDescending(val => val % 10);              Console.WriteLine("Query2:");             foreach (var item in  query2)             {                 Console.WriteLine("{0}",  item);             }         }     } }

以上的兩個排序Demo都是采用默認的int排序比較器,在一些開發中,以下兩種情況需要使用特定的數據比較器:

  • 默認的數據類型不能滿足特殊的比較需要
  • 自定義的類不存在默認的數據比較器

using System; using System.Linq; using System.Collections.Generic;

namespace ConsoleApplication3 {      //自定義int類型比較器,實現IComparable<int>接口     class MyCompare :  IComparer<int>     {         public int Compare(int x, int  y)         {             int x1 = Math.Abs(x);             int y1 =  Math.Abs(y);             if (x1 > y1)             {                  return 1;             }             else if (x1 == y1)              {                 return 0;             }              else             {                 return -1;             }          }     }

    class Program     {         static void Main(string[]  args)         {             //實例化自定義比較器             MyCompare mc = new  MyCompare();             int[] intary = { 1, -2, 3, -4, 5, -6, 7, -8, 9, -10  };             var query1 = intary.OrderBy(val => val, mc);              Console.WriteLine("Query1");             foreach (var item in  query1)             {                  Console.WriteLine("{0}",item);             }         }     } }

3.用Skip()、SkipWhile()跳過元素

using System; using System.Linq; using System.Collections.Generic;

namespace ConsoleApplication3 {     class Program     {          static void Main(string[] args)         {             int[] intary = { 1,  2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40 };              //跳過intAry中前3個元素             var query1 = intary.Skip(3);              Console.WriteLine("Query1");             foreach (var item in  query1)             {                 Console.WriteLine("{0}",  item);             }

            //跳過intAry中小於5的元素             var query2 =  intary.SkipWhile(num => num < 5);              Console.WriteLine("Query2");             foreach (var item in  query2)             {                 Console.WriteLine("{0}",  item);             }         }     } }

4.用Take()、TakeWhile()提取元素

using System; using System.Linq; using System.Collections.Generic;

namespace ConsoleApplication3 {     class Program     {          static void Main(string[] args)         {             int[] intary = { 1,  2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40 };              //取intAry中前3個元素             var query1 = intary.Take(3);              Console.WriteLine("Query1");             foreach (var item in  query1)             {                 Console.WriteLine("{0}",  item);             }

            //取intAry中小於5的元素             var query2 = intary.TakeWhile(num  => num < 5);             Console.WriteLine("Query2");              foreach (var item in query2)             {                  Console.WriteLine("{0}", item);             }         }      } }

5.對元素進行數值計算

  • Min():求最小值
  • Max():求最大值
  • Sum():求和
  • Average():求平均值

using System; using System.Linq;

namespace ConsoleApplication3 {     class Program     {          static void Main(string[] args)         {             int[] intary = { 1,  2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40 };             var intMin =  intary.Min();             var intMax = intary.Max();             var  intSum = intary.Sum();             var intAverage =  intary.Average();             Console.WriteLine("intary's  min={0},max={1},sum={2},average={3}",intMin,intMax,intSum,intAverage);

            string[] strAry = { "Kevin", "James", "Ken", "Ben"  };             var strMin = strAry.Min();             var strMax =  strAry.Max();             Console.WriteLine("strAry's Min =  {0},Max={1}",strMin,strMax);         }     } }

6.用Distinct()消除集合中相等的元素

using System; using System.Linq;

namespace ConsoleApplication3 {     class Program     {          static void Main(string[] args)         {             int[] intary = {  1,1, 2,2, 3, 3, 4, 5};             var query1 =  intary.Distinct();             foreach (var item in query1)              {                 Console.WriteLine(item);             }          }     } }

7.用Concat()連接兩個集合

using System; using System.Linq;

namespace ConsoleApplication3 {     class Program     {          static void Main(string[] args)         {             string[] strAry1 =  {"Kevin","James","Ben"};             string[] strAry2 = {  "Ken","Joanna","cc"};             var query1 =  strAry1.Concat(strAry2);              Console.WriteLine("Query1");             foreach (var item in  query1)             {                  Console.WriteLine(item);             }

            var query2 = strAry2.Concat(strAry1);              Console.WriteLine("Query2");             foreach (var item in  query2)             {                  Console.WriteLine(item);             }         }     } }

注意:Concat()方法是直接將兩個集合中的元素連接在一起,不會進行重新排序、過濾等,就算兩個集合中元素有重復也同樣保留。

8.集合操作

說到集合,很容易想起並集、交集、差集3種常用操作。在LINQ中,IEnumerable<T>類分別通過Union()、Intersect()、Except完成這3種操作()。

using System; using System.Linq;

namespace ConsoleApplication3 {     class Program     {          static void Main(string[] args)         {             int[] intAry1 =  {1,2,3};             int[] intAry2 = {3,4,5};             var query1 =  intAry1.Union(intAry2);             Console.WriteLine("並集");              foreach (var item in query1)             {                  Console.WriteLine(item);             }

            var query2 = intAry1.Intersect(intAry2);              Console.WriteLine("交集");             foreach (var item in  query2)             {                  Console.WriteLine(item);             }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM