标签:
匿名委托+内置委托+Lambda表达式
概要
在实际开发中,项目开发框架不同,用到的技术是不一样的,这里总结一下用Linq开发,ORM之EF开发会大量使用的Lambda表达式;
正文
之前提过.Net有一套扩展在IEumberable<T>泛型接口的扩展方法,本文是从这个基础继续总结;
1.void Action<in T>:
先拿一个ForEach()来讲:
public void ForEach(Action<T> action);
这个Action<T>是.Net的其中一个内置委托,Action<T>的其中一个签名如下:
public delegate void Action<in T>(T obj);
这个签名接受一个入参并且没有返回值,这里举一个例子,代码如下:
//提供一个数据源
static List<UserInfo> getList()
{
List<UserInfo> list = new List<UserInfo>() {
new UserInfo("Francis",21),
new UserInfo("Lyfeng",25),
new UserInfo("Harry",24)
};
return list;
}
//面向对象编程
class UserInfo
{
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
public UserInfo(string name,int age)
{
this.name = name;
this.age = age;
}
public override string ToString()
{
return "姓名:" + this.name + " 年龄:" + this.Age;
}
}
根据这个Action<T>的签名定义,来一个自定义方法myAction(UserInfo user):
在main函数中写两句代码:
var list = getList();
list.ForEach(myAction);
结果:
接下来,使用匿名委托来取代myAction,如下图:
再接下来,由匿名委托到Lambda表达式:
2.bool Predicate<in T>
再拿一个FindAll()来讲:
public List<T> FindAll(Predicate<T> match);
Predicate是.Net的另一个内置委托,其中一个重载签名如下:
public delegate bool Predicate<in T>(T obj);
这个重载返回值为bool,接受一个入参,接下来自定义一个myPredicate(UserInfo user)
使用匿名委托实现:
由匿名委托到Lambda表达式:
3.TResult Func<in T, out TResult>
拿Where()来讲,这是一个扩展至IEnumerable<TSource>的扩展方法:
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source,
Func<TSource, bool> predicate);
Func<in T, out TResult>是.Net的另一个常用内置委托,其中一个签名如下:
public delegate TResult Func<in T, out TResult>(T arg);
这个签名接受一个入参,返回值为TResult,即不固定的,下面以返回bool表示:
4.int Comparison<in T>(T x, T y)
拿Sort()来讲,签名如下
public void Sort(Comparison<T> comparison);
Comparison<T>是.Net的其中一个内置委托,其中签名如下:
public delegate int Comparison<in T>(T x, T y);
返回值int,两个一样的入参:
结束!
标签:
原文地址:http://www.cnblogs.com/Francis-YZR/p/4778274.html