泛型委托 Predicate/Func/Action
Predicate 泛型委托
表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。
看看下面它的定义:
// Summary:
// Represents the method that defines a set of criteria and determines whether
// the specified object meets those criteria.
//
// Parameters:
// obj:
// The object to compare against the criteria defined within the method represented
// by this delegate.
//
// Type parameters:
// T:
// The type of the object to compare.
//
// Returns:
// true if obj meets the criteria defined within the method represented by this
// delegate; otherwise, false.
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定义的参数
完整代码:
XX.FindAll(delegate(String c) { return c.Length <=3; });
这应该称为匿名代理了。
其他使用到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;
}
}
同样解决了上面的问题,这里罗嗦了只是为说明Predicate的用法而已。
对于Predicate的应用当然这不是什么新鲜事情,今天细细思味一番,觉得C# 真是一门优雅的语言。
以供初学者参考。
笔者本想对以下几种泛型委托一一做些介绍和总结的,在理解Predicate的过程中,发现只要理解了泛型、委托和匿名代理,
当然你晓得Lambda表达式更好,就完全可以在适当的时候灵活应用他们了。也就是说,只是定义不同的delegate而已,
一是 你可以自己定义这样的delegate,再行使用;
二是 你需要知道象Predicate、Func、Action这样的已有好的delegate是如何定义的。或者使用的时候适当查阅下MSDN即可。
如:
Func():封装一个不具有参数但却返回 TResult 参数指定的类型值的方法。
Func(T1, T2, TResult):封装一个具有两个参数并返回 TResult 参数指定的类型值的方法,没有T2就是封装一个具有参数并....。
Action() Action(T1) Action(T2) : 封装一个方法,该方法指定数量的参数(如()无参数,(T1)一个参数,以此类推)并且不返回值。这个和Func有相似处,但无返回值而已。
提醒大家的注意的是:
x=>x+x;
与
X=> {return x+x;} 是等价的。
针对解释我又结合MVC做了下练习。
1、结构
2、如图分别在Controller 下建立PredicateController.cs;Views下建立Predicate文件夹,然后在其下建立index (View)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace PredicatePractice.Controllers
{
public class PredicateController : Controller
{
//
// GET: /Predicate/
public ActionResult Index()
{
List<string> StrList = new List<string>() {
"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
}; string[] arrayList = new string[] {
"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"
};
//返回arrayList中长度小于3的单词数组(string[])
string[] NewArray = Array.FindAll(arrayList, c => c.Length < 4); //返回StrList中中长度小于3的单词数组(List<string>)
List<string> NewList = StrList.FindAll(c => c.Length < 4); //利用CheckStr方法(泛型委托)来进行筛选
string[] NewArrayUseCheckFunc = Array.FindAll(arrayList, CheckStr); //利用CheckStr方法(泛型委托)来进行筛选
List<string> NewListUseCheckPredicate = StrList.FindAll(CheckStr); ViewData["NewArray"] = NewArray;
ViewData["NewList"] = NewList;
ViewData["NewArrayUseCheckFunc"] = NewArrayUseCheckFunc;
ViewData["NewListUseCheckPredicate"] = NewListUseCheckPredicate;
return View();
} /// <summary>
/// 检查字符串S长度 是否小于4
/// </summary>
/// <param name="S"></param>
/// <returns></returns>
private bool CheckStr(string S)
{
if (S.Length < 4)
return true;
else
return false;
} }
}
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %> <asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
index
</asp:Content> <asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> <h2>Pradicatepractice
<br />
数组{"One","Two","Three","Four","Fice","Six","Seven","Eight","Nine","Ten"}<br />
--------------Begin--------------<br />
<font color="red"><b>string[] NewArray = Array.FindAll(arrayList, c => c.Length < 3);</b></font><br />
结果:
<% IList<string> NewArray = (ViewData["NewArray"] as IEnumerable<string>).ToList<string>(); %>
<%= Html.Display("<br/>") %>
<% for (int i = 0; i < NewArray.Count; i++) %>
<% { %>
<%= Html.Label(NewArray[i].ToString())%>
<% } %>
<br />
------------------------------<br />
<font color="red"><b>List< string > NewList = StrList.FindAll(c => c.Length < 3);</b></font><br />
结果:
<% IList<string> NewList = (ViewData["NewList"] as IEnumerable<string>).ToList<string>(); %>
<% for (int j = 0; j < NewList.Count; j++) %>
<% { %>
<%= Html.Label(NewList[j].ToString())%>
<% } %>
<br />
------------------------------<br />
<font color="red"><b>Lstring[] NewArrayUseCheckFunc = Array.FindAll(arrayList, CheckStr);</b></font><br />
结果:
<% IList<string> NewArrayUseCheckFunc = (ViewData["NewArrayUseCheckFunc"] as IEnumerable<string>).ToList<string>(); %>
<% for (int k = 0; k < NewArrayUseCheckFunc.Count; k++) %>
<% { %>
<%= Html.Label(NewArrayUseCheckFunc[k].ToString())%>
<% } %>
<br />
------------------------------<br />
<font color="red"><b>List< string > NewListUseCheckPredicate = StrList.FindAll(CheckStr);</b></font><br />
结果:
<% IList<string> NewListUseCheckPredicate = (ViewData["NewListUseCheckPredicate"] as IEnumerable<string>).ToList<string>(); %>
<% for (int l = 0; l < NewListUseCheckPredicate.Count; l++) %>
<% { %>
<%= Html.Label(NewListUseCheckPredicate[l].ToString())%>
<% } %>
<br />
---------------End---------------<br />
</h2> </asp:Content>
效果如图:
泛型委托 Predicate/Func/Action的更多相关文章
- C#的泛型委托Predicate/Func/Action(转)
Predicate 泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素. 类型参数介绍: T: 要比较的对 ...
- C#的泛型委托Predicate/Func/Action
Predicate<T> 是一个委托,它代表了一个方法,它的定义是: namespace System { // 摘要: 表示定义一组条件并确定指定对象是否符合这些条件的方法. ...
- C#泛型委托Predicate、Action、Func
Predicate Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法.此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素.通过查看源码发现 Pr ...
- 委托、Action泛型委托、Func泛型委托、Predicate泛型委托的用法
一.举一委托场景:天气很热,二狗子想去买瓶冰镇可乐,但是二狗子很懒,于是他想找个人代他去,于是要有个代理人. 创建代理人之前先定义委托:public delegate string BuyColaDe ...
- .NET自带泛型委托方法Func、Action和Predicate
Func.Action和Predicate是.NET自带的3个泛型委托方法,三个方法的区别其实并不大,要强行给混着用也是可以的,但是我们是有追求的人,把道理讲清楚总是好的. 一.Func是有返回值的方 ...
- C#语法糖之第六篇: 泛型委托- Predicate<T>、Func<T>
今天继续分享泛型委托的Predicate<T>,上篇文章讲了Action委托,这个比Action委托功不一样的地方就是委托引用方法是Bool返回值的方法,Action为无返回值.首先我们看 ...
- 第十节:委托和事件(2)(泛型委托、Func和Action、事件及与委托的比较)
一. 泛型委托 所谓的泛型委托,即自定义委托的参数可以用泛型约束,同时内置委托Func和Action本身就是泛型委托. 将上一个章节中的Calculator类中的方法用自定义泛型委托重新实现一下. p ...
- 匿名方法、Lambda表达和自定义泛型委托以及Func、Action系统泛型委托
1.匿名方法的概念:一个方法没有具体的名称,而只有关键字delegate.方法参数.方法体.这种方法是匿名方法. 匿名方法的好处:将具体方法和委托直接关联在一起,如果我们基于委托只需要一个方法的时候, ...
- 系统内置委托:Func/Action
lSystem.Func 代表有返回类型的委托 lpublic delegate TResult Func<out TResult>(); lpublic delegate TResul ...
随机推荐
- 【读书笔记】iOS-GCD-API
一,Dispatch Queue dispatch_async(queue, ^{ /* *想执行的任务 */ }); 其中queue分为两种: 1,Serial Dispatch Queue 等待现 ...
- CoreAnimation-08-CATransition
概述 简介 CATransition又称转场动画,是CAAnimation的子类,可以直接使用 转场动画主要用于为图层提供移入/移出屏幕的动画效果 转场动画常见的应用是UINavigationCont ...
- clang: error: no such file or directory: xxx.pch
今天打开一个下载的例子 报clang: error: no such file or directory: xxx.pch的错 说一下解决方案 1.先在你的工程里找到这.pch文件- 2.把它现在的路 ...
- Reveal常用技巧(翻译来自Reveal官网blog)
翻译来自官网:http://revealapp.com/blog/reveal-common-tips-cn.html 以下基于Reveal 1.6. 用于快速上手的内置应用 刚刚下载Reveal,啥 ...
- 菜鸟程序员之Asp.net MVC Session过期异常的处理
小赵是刚毕业的计算机专业方面的大学生,4年的大学时间里面,他读过了很多编程方面的数据,也动手也了很多代码.现在毕业了,他如愿的加入了T公司,开始了自己的程序员生涯.他信心满满,相信自己4年的学习到的东 ...
- JavaScript Patterns 3.2 Custom Constructor Functions
When you invoke the constructor function with new, the following happens inside the function: • An e ...
- linux修改open files数
概要 linux系统默认open files数目为1024, 有时应用程序会报Too many open files的错误,是因为open files 数目不够.这就需要修改ulimit和file-m ...
- IIS does not list a website that matches the launch url
233down voteaccepted I hate answering my questions: in my question i stated that i was running VS un ...
- SQL Server 2008 R2——VC++ ADO 操作 存储过程
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- linux 创建和删除目录
创建目录命令 mkdir 目录名 [root@wang whp]# mkdir catalog[root@wang whp]# lscatalog [root@wang whp]# mkdir cat ...