Lambda表达式之进化(2)

list.Sort(new Comparison<Person>(delegate(Person p, Person p1) { return p.Age - p1.Age; })); /*年龄按照从小到大顺序排列*/

同样可以简写为:

list.Sort((delegate(Person p, Person p1) { return p.Age - p1.Age; }));

Func

貌似在系统内置泛型委托中Func在实际项目开发中是使用的最多的。

概念:封装一个具有一个参数并返回 TResult 参数指定的类型值的方法。参数类型为逆变,返回值参数类型为协变。

用到此委托的最多的就是List泛型集合中的 Select 方法了,看看内置的Select方法是如何利用Func来实现返回一个新的集合的。

(1)结合匿名方法实现

我们接下来在上面基础上再定义一个Animal类。属性和Person类一样,代码如下:

public class Animal { public string Name { get; set; } public int Age { get; set; } public bool Gender { get; set; } }

接下来我们就通过Select方法通过Person的集合来返回一个新的集合即Animal集合。代码如下:

var list = GetList(); List<Animal> animalList = list.Select(new Func<Person, Animal>(delegate(Person p) { return new Animal() { Name = p.Name, Age = p.Age, Gender = p.Gender }; })).ToList(); animalList.ForEach(delegate(Animal animal) { Console.WriteLine(animal.Name); });

同样打印出当遍历Person集合时的结果一样,看起来似乎很繁琐,我们将代码通过进行精简如下:

var list = GetList(); List<Animal> animalList = list.Select((delegate(Person p) { return new Animal() { Name = p.Name, Age = p.Age, Gender = p.Gender }; })).ToList(); animalList.ForEach(delegate(Animal animal) { Console.WriteLine(animal.Name); });

下面我们通过扩展方法来自定义实现Select()方法,代码如下:

public static List<TR> SelfDefineSelect<T, TR>(this List<T> list, Func<T, TR> fun)/*T为传进来的泛型集合类型,TR为返回的泛型集合类型*/ { List<TR> selList = new List<TR>(); /*实例化返回的泛型集合*/ foreach (T t in list) { TR tr = fun(t); /*获取传进来的集合数据*/ selList.Add(tr); } return selList; /*返回新的泛型集合*/ }

依然是进行此调用,打印结果正确:

List<Animal> animalList = list.SelfDefineSelect((delegate(Person p) { return new Animal() { Name = p.Name, Age = p.Age, Gender = p.Gender }; })).ToList();

 (2)结合匿名类来实现

当我们使用Func根据条件转换成新的集合时可能只需要几个实例成员,这个时候如果还重新建立一个类来进行获取就显得有点小题大做了,这个时候只需将其需要的或的成员传给一个匿名类即可,这个就是Func需要用到匿名类的场景。所以鉴于此,我们将返回的新的集合为匿名集合而非Animal集合,代码改造如下:

var anyousList = list.Select((delegate(Person p) { return new { Name = p.Name}; /*结合匿名类使用*/ }));

通过上述所讲系统内置泛型委托的实现,似乎有点不太令人满意,关于委托的代码太过繁琐,是的微软大大也明确知道了这点,于是乎,一步一步走向了高级,那就下文的lambda表达式,这结构的简单简直了。。。让你爽到暴。

lambda表达式

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/53547d1d0cbef5e6034011c3b3e6b0bd.html