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表达式