C#中Predicate<T>与Func<T, bool>泛型委托的用法实例
本文以实例形式分析了C#中Predicate<T>与Func<T, bool>泛型委托的用法,分享给大家供大家参考之用。具体如下:
先来看看下面的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
static void Main( string [] args) { List< string > l = new List< string >(); l.Add( "a" ); l.Add( "b" ); l.Add( "s" ); l.Add( "t" ); if (l.Exists(s => s.Equals( "s" ))) { string str = l.First(s => s.Equals( "s" )); Console.WriteLine(str); } else Console.WriteLine( "Not found" ); } |
非常简单,就是先判断字符串列表l中是否有s字符串,如果有,则取之并显示出来。从代码中可以看到,l.Exists方法和l.First方法所使用的参数是相同的,但事实是否真是如此?
事实上,List<T>.Exists和List<T>.First的参数分别使用了不同的委托:
Predicate<T>和Func<T,
bool>。从函数的签名上看,两者没有区别,都是指代的参数类型为T,返回值为bool的函数,但毕竟两者属于不同的委托类型,因此,下面的代码显然是无法编译通过的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
static void Main( string [] args) { List< string > l = new List< string >(); l.Add( "a" ); l.Add( "b" ); l.Add( "s" ); l.Add( "t" ); Func< string , bool > p = s => s.Equals( "s" ); if (l.Exists(p)) { string str = l.First(p); Console.WriteLine(str); } else Console.WriteLine( "Not found" ); } |
然而,由于Predicate<T>和Func<T,
bool>的确指代的是同一类具有相同签名的函数,而我们往往又不希望将匿名方法的方法体重复地写两次以分别赋予Predicate<T>和Func<T,
bool>泛型委托,因此,我们可以自己写一个扩展方法,扩展Func<T,
bool>类型以使其能够很方便的转换成Predicate<T>类型:
1
2
3
4
5
6
7
8
|
public static class Extensions { public static Predicate<T> ToPredicate<T> ( this Func<T, bool > source) { Predicate<T> result = new Predicate<T>(source); return result; } } |
在引入了这个扩展方法之后,我们的代码就可以写成下面的形式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
static void Main( string [] args) { List< string > l = new List< string >(); l.Add( "a" ); l.Add( "b" ); l.Add( "s" ); l.Add( "t" ); Func< string , bool > p = s => s.Equals( "s" ); if (l.Exists(p.ToPredicate())) { string str = l.First(p); Console.WriteLine(str); } else Console.WriteLine( "Not found" ); } |
说实话不知为何MS要用这样两种完全不同的泛型委托来实现Exists和First方法,这使得某些情况下代码变得相对复杂,甚至容易出错。我想大概是为了语义清晰的缘故,Exists不过是做判断,因此需要用断言表达式,而在做First操作的时候,则更多的意义上是在迭代地调用指定的方法。学无止境,有待继续探索。
希望本文所述对大家的C#程序设计有所帮助。
C#中Predicate<T>与Func<T, bool>泛型委托的用法实例的更多相关文章
- Predicate<T>与Func<T, bool>泛型委托
引用别人的: static void Main(string[] args) { List<string> l = new List<string>(); l.Add(&quo ...
- (转)C#中的Predicate<T>与Func<T, bool>
Delegate至少0个参数,至多32个参数,可以无返回值,也可以指定返回值类型.这个是祖宗. Func可以接受0个至16个传入参数,必须具有返回值. Action可以接受0个至16个传入参数,无 ...
- 委托、Action泛型委托、Func泛型委托、Predicate泛型委托的用法
一.举一委托场景:天气很热,二狗子想去买瓶冰镇可乐,但是二狗子很懒,于是他想找个人代他去,于是要有个代理人. 创建代理人之前先定义委托:public delegate string BuyColaDe ...
- Func<T,TResult>泛型委托
描述: 封装一个具有一个参数并返回TResult参数指定的类型值的方法. 语法: public delegate TResult Func<T,TResult>(T arg); 参数类型: ...
- SQL中拆分字符串substr及统计字符出现频数replace用法实例讲解
一.拆分字符串为若干行 例一:要求将表emp中的'king'按照每行一个单词拆成四行 注意:substr(str,pos):截取pos位置开始的字符: substr(str,pos,len):从pos ...
- lambda表达式Expression<Func<Person, bool>> 、Func<Person, bool>区别
前言: 自己通过lambda表达式的封装,将对应的表达式转成字符串的过程中,对lambda表达式有了新的认识 原因: 很多开发者对lambda表达式Expression<Func<Pers ...
- Expression<Func<T, bool>>与Func<T, bool>的区别
转自:http://www.cnblogs.com/wow-xc/articles/4952233.html Func<TObject, bool>是委托(delegate) Expres ...
- Expression<Func<TObject, bool>>与Func<TObject, bool>的区别
Func<TObject, bool>是委托(delegate) Expression<Func<TObject, bool>>是表达式 Expression编译后 ...
- C#中的Action和Func和Predicate
一.[action<>]指定那些只有输入参数,没有返回值的委托 用了Action之后呢: 就是相当于省去了定义委托的步骤了. 演示代码: using System; using Syste ...
随机推荐
- PC/UVa 题号: 110106/10033 Interpreter (解释器)题解 c语言版
, '\n'); #include<cstdio> #include<iostream> #include<string> #include<algorith ...
- 【转】2013年中国IT业10大公司
转自:http://www.chinaz.com/news/2013/1217/331446.shtml?zyy 1.最得志的公司:小米 在2013年,再没有一家公司像小米这样志得意满,即便看看所有的 ...
- 【转】Delphi调用webservice总结
原文:http://www.cnblogs.com/zhangzhifeng/archive/2013/08/15/3259084.html Delphi调用C#写的webservice 用delph ...
- SuperToolTips
https://github.com/nhaarman/supertooltips supertooltips-master.zip
- HOW MYSQL USES INTERNAL TEMPORARY TABLES
HOW MYSQL USES INTERNAL TEMPORARY TABLES Table of Contents [hide] 1)UNION queries 2)Some views 3)SQL ...
- SQL用法总结
1.创建数据库语句 create table persons( 'id' INT NOT NULL AUTO_INCREMENT, ) NOT NULL, ) NOT NULL, PRIMARY KE ...
- T4 文本模板编写准则
如果要在 Visual Studio 中生成程序代码或其他应用程序资源,遵守以下一般准则可能非常有帮助. 它们并不是一成不变的规则. 设计时 T4 模板准则 设计时 T4 模板是在设计时在 Visua ...
- Computer Science Theory for the Information Age-3: 高维空间中的高斯分布和随机投影
高维空间中的高斯分布和随机投影 (一)在高维球体表面产生均匀分布点的方法 我们来考虑一个采样问题,就是怎样在高维单位球体的表面上均匀的采样.首先,考虑二维的情况,就是在球形的周长上采样.我们考虑如下方 ...
- JS中URL编码参数(UrlEncode)
JS中URL编码参数(UrlEncode) 网上有很多文字作品写涉及在JS中呈现类似UrlEncode功能时都是自定义参数来呈现,其实JS中本身就有那样的参数.参数parameter由于用类似URL的 ...
- 无限滚动 --demo
<!DOCTYPE HTML><html><head><meta http-equiv="Content-Type" content=&q ...