表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 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; } }