類型參數(shù)介紹: T: 要比較的對(duì)象的類型。 obj:要按照由此委托表示的方法中定義的條件進(jìn)行比較的對(duì)象。 返回值:如果 obj符合由此委托表示的方法中定義的條件,則為 true;否則為false。 看下面代碼 public class GenericDelegateDemo { List<String> listString = new List<String>() { "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten" };
String[] arrayString = new String[] { "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten" };
public String[] GetFirstStringFromArray() { return Array.FindAll(arrayString, (c) => { return c.Length <= 3; }); }
public List<String> GetFirstStringFromList() { return listString.FindAll((c) => { return c.Length <= 3; }); }
public String[] GetFirstStringFromArray_1() { return Array.FindAll(arrayString, GetString); }
public List<String> GetFirstStringFromList_1() { return listString.FindAll(GetString); }
private bool GetString(String str) { if (str.Length <= 3) return true; else return false; } } |
(1)首先,上面以 數(shù)組和泛型List 兩個(gè)集合作為演示對(duì)象,并構(gòu)建集合。 (2)接著,兩者同時(shí)使用各自 所有的 FindALL方法,參見如下定義: Array :public T[] FindAll<T>(T[] array,Predicate<T> match); List:public List<T>FindAll(Predicate<T> match); 注意的是,兩處的FindAll 均采用了Predicate (泛型委托)作為參數(shù)的類型。 (3)接著,使用兩者方式展現(xiàn) 對(duì)Predicate 的使用: 第一種: (c) => { return c.Length<= 3; }; 第二種:GetString(String str)。 這兩者在語(yǔ)法上明顯不同,但是實(shí)際是做相同的事情,第一種是使用Lambda表達(dá)式構(gòu)建的語(yǔ)句,關(guān)于Lambda這里不做詳述,請(qǐng)參見筆者C#3.0特性相關(guān)文章。 補(bǔ)充的是你也可以這樣寫, delegate(String c){returnc.Length<=3;} 作為 Predicate定義的參數(shù) 完整代碼: XX.FindAll(delegate(String c) { return c.Length <= 3; }); |
這應(yīng)該稱為匿名代理了。 其他使用到Predicate 有 Array.Find , Array.FindAll , Array.Exists ,Array.FindLast , Array.FindIndex ..... List<T>.Find ,List<T>.FindAll ,List<T>.Exists ,List<T>.FindLast ,List<T>.FindIndex ..... 延伸: 除了上面提到的外,你完全可以使用Predicate 定義新的方法,來(lái)加強(qiáng)自己代碼。 public class GenericDelegateDemo { List<String> listString = new List<String>() { "One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten" }; public String GetStringList(Predicate<String> p) { foreach(string item in listString) { if (p(item)) return item; } return null; }
public bool ExistString() { string str = GetStringList((c) => { return c.Length <= 3 && c.Contains('S'); }); if (str == null) return false; else return true; } } |
同樣解決了上面的問(wèn)題,這里羅嗦了只是為說(shuō)明Predicate的用法而已。 對(duì)于Predicate的應(yīng)用當(dāng)然這不是什么新鮮事情,今天細(xì)細(xì)思味一番,覺得C# 真是一門優(yōu)雅的語(yǔ)言。 以供初學(xué)者參考。 筆者本想對(duì)以下幾種泛型委托一一做些介紹和總結(jié)的,在理解Predicate的過(guò)程中,發(fā)現(xiàn)只要理解了泛型、委托和匿名代理, 當(dāng)然你曉得Lambda表達(dá)式更好,就完全可以在適當(dāng)?shù)臅r(shí)候靈活應(yīng)用他們了。也就是說(shuō),只是定義不同的delegate而已, 一是 你可以自己定義這樣的delegate,再行使用; 二是你需要知道象Predicate、Func、Action這樣的已有好的delegate是如何定義的?;蛘呤褂玫臅r(shí)候適當(dāng)查閱下MSDN即可。 如: Func():封裝一個(gè)不具有參數(shù)但卻返回 TResult 參數(shù)指定的類型值的方法。 Func(T1, T2, TResult):封裝一個(gè)具有兩個(gè)參數(shù)并返回 TResult參數(shù)指定的類型值的方法,沒有T2就是封裝一個(gè)具有參數(shù)并....。 Action() Action(T1) Action(T2) :封裝一個(gè)方法,該方法指定數(shù)量的參數(shù)(如()無(wú)參數(shù),(T1)一個(gè)參數(shù),以此類推)并且不返回值。這個(gè)和Func有相似處,但無(wú)返回值而已。 提醒大家的注意的是: x=>x+x; 與 X=> {returnx+x;} 是等價(jià)的。 |