国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
C#的泛型委托Predicate/Func/Action(轉(zhuǎn))

#的泛型委托Predicate/Func/Action(轉(zhuǎn))

(2009-11-03 11:27:11)
標(biāo)簽:

雜談

分類: 其他學(xué)習(xí)
Predicate

泛型委托:表示定義一組條件并確定指定對(duì)象是否符合這些條件的方法。此委托由 Array 和 List類的幾種方法使用,用于在集合中搜索元素。

類型參數(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 <= && 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à)的。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Lambda表達(dá)式和Predicate泛型委托
C#基礎(chǔ)之匿名方法實(shí)例教程
基礎(chǔ)拾憶------委托詳解
JAVA學(xué)習(xí)線路:day13-JDK8新特性
大數(shù)據(jù)學(xué)習(xí)路線分享高階函數(shù)
C# List<T>用法
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服