Linq To Object——三種委託

語言: CN / TW / HK
  1. Predicate\泛型委託用來定義一組條件並確定指定物件是否符合這些條件的方法,其語如下:

Public delegate bool Predicate\(T obj)

引數說明:

T:要比較的物件型別

Obj:要按照由此委託表示的方法中定義的條件進行比較的物件。

返回值:如果符合此委託表示的方法中定義的條件,則為true,否則為false

  1. Action\泛型委託用來封裝一個方法,該方法只採用一個引數並且不返回值,其語法如下:public delegate void Action\ (T obj)

引數說明                                                             

T:委託封裝的方法的引數型別。

Obj:委託封裝的方法的引數

  1. Func\泛型委託封裝一個具有一個引數並返回 TResult 引數指定的型別值的方法。,其語法格式如下:

public delegate TResult Func\(T arg);

T:此委託封裝的方法的引數型別。

TResult: 此委託封裝的方法的返回值型別。

返回結果:   此委託封裝的方法的返回值。例1:查詢指定的字串。

//宣告一個數組並初始化

string[] strLists = new string[] { "明日科技", "C#程式設計詞典", "C#範例大全" };

Console.WriteLine("源字串陣列:");

//使用foreach語句遍歷輸出

foreach (string str in strLists)

{

Console.Write(str + "  ");

}

Console.WriteLine("\n");

// 第一種寫法 使用Lambda表示式查詢陣列中包含“C#”的字串

string[] strList = Array.FindAll(strLists, s => (s.IndexOf("C#") >= 0));

//第二種寫法 使用匿名方法的方式

string[] strList = Array.FindAll(strLists, (s) => { return s.IndexOf("C#") >= 0; });

Console.WriteLine("查詢到的包含“C#”的字串:");

//使用foreach語句遍歷輸出

foreach (string str in strList)

{

Console.Write(str + "  ");

}

輸出結果:

源字串陣列:

明日科技  C#程式設計詞典  C#範例大全

查詢到的包含“C#”的字串:

C#程式設計詞典  C#範例大全

  1. 例2:Lambda表示式查詢List列表,使用Predicate委託查詢年齡大於30的員工。

class Program

{

static void Main(string[] args)

{

new Program().PredicateDelegate();//呼叫自定義方法顯示資訊

}

public void PredicateDelegate()

{

List\ P_List_user = new List\();//建立泛型集合

//為泛型集合賦值

P_List_user.Add(new User() { Name = "小劉", Age = 33, Pay = 5000 });

P_List_user.Add(new User() { Name = "小王", Age = 30, Pay = 5000 });

P_List_user.Add(new User() { Name = "小趙", Age = 32, Pay = 5000 });

P_List_user.Add(new User() { Name = "小呂", Age = 30, Pay = 5000 });

P_List_user.Add(new User() { Name = "小房", Age = 31, Pay = 5000 });

string P_Str = string.Empty;//定義一個字串變數,用來記錄輸出資訊

//第一種實現方式:匿名方法

List\ P_List_temp = P_List_user.FindAll(//在泛型集合中查詢

(pp) =>//定義匿名方法

{

return pp.Age > 30;//指定查詢條件

});

//第二種實現方式:Lambda表示式,Predicate委託實現

List\ P_List_temp = P_List_user.FindAll(pp => pp.Age > 30);

//第一種實現方式:定義匿名方法

P_List_temp.ForEach(//遍歷查詢結果

(pp) =>                {

//記錄查詢到的資訊

P_Str += "姓名:" + pp.Name + "   年齡:" +pp.Age.ToString() + Environment.NewLine;

});

//第二種方式:Lambda表示式

P_List_temp.ForEach(pp=>Console.WriteLine(pp.Name));

Console.WriteLine(P_Str);//輸出資訊

Console.ReadLine();

}

class User

{

public string Name { get; set; }//自動實現名稱屬性

public int Age { get; set; }//自動實現年齡屬性

public double Pay { get; set; }//自動實現薪資屬性

public override string ToString()

{

return string.Format(

| 同理計算員工工資的總和:Double pay=P_List_user.Sum((pp)=>{return pp.Pay;}); | | --------------------------------------------------------------- |

"姓名:{0}  年齡:{1}  工資:{2}", Name, Age, Pay);//對資訊進行格式化

}

}

}