泛型委托 Predicate/Func/Action

 表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。

 public delegate bool Predicate<T>(T obj);

类型参数介绍:

   T: 要比较的对象的类型。

   obj: 要按照由此委托表示的方法中定义的条件进行比较的对象。

   返回值:如果 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)首先,上面以 数组和泛型List 两个集合作为演示对象,并构建集合。

(2)接着,两者同时使用各自 所有的 FindALL方法,参见如下定义:

    Array : public T[] FindAll<T>(T[] array, Predicate<T> match);

    List:public List<T> FindAll(Predicate<T> match);

    注意的是,两处的FindAll 均采用了Predicate (泛型委托)作为参数的类型。

(3)接着,使用两者方式展现 对Predicate 的使用:

    第一种:  (c) => { return c.Length <= 3; };

    第二种: GetString(String str)。

这两者在语法上明显不同,但是实际是做相同的事情,第一种是使用Lambda表达式构建的语句,关于Lambda这里不做详述,请参见笔者C#3.0特性相关文章。

补充的是你也可以这样写,

  delegate(String c){return c.Length<=3;} 作为 Predicate定义的参数

其他使用到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 定义新的方法,来加强自己代码。

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;



    }

}

 

posted @ 2013-07-16 15:00  混迹  阅读(256)  评论(0编辑  收藏  举报