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);//對信息進行格式化

}

}

}