- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace 泛型
- {
- class Array使用泛型委托
- {
- public static void Main()
- {
- //C#从2.0开始对Array类的很多方法,提供了泛型委托参数
- // 例如: Array下的 Sort方法: public static void Sort<T>( T[] array ,Comparison<T> comparison )
- // 使用了下面的Comparison委托做参数
- // public delegate int Comparison<T>( T x , T y )
- Person[] pers = new Person[] { new Person( "zhao" , 15 ) , new Person( "aladdin" , 30 ) , new Person("jacky" , 20 )};
- Array.Sort<Person>( pers, (p1, p2) => p1.CompareTo( p2) );
- foreach (Person p in pers)
- {
- Console.WriteLine( p.name + "--" + p.age ); // 15 20 30
- }
- //Array中的ForEach方法
- //public static void ForEach<T>( T[] array, Action<T> action)
- //第二个参数是委托Action
- //public delegate void Action<T>(T obj)
- //这个方法其实就是遍历把第一个元素当参数给委托方法执行一次
- Array.ForEach<Person>( pers , Console.WriteLine ); //每个对象都被输出了一次,因为我们没重写ToString,所以输出的是对象名
- //如果需要更多的控制,可以用呀妈得(我不会读)表达式
- Array.ForEach<Person>(pers, param => Console.WriteLine(param.name + "--" + param.age));
- //Array中的FindAll方法
- //public static T[] FindAll<T>( T[] array, Predicate<T> match)
- //使用了委托
- //public delegate bool Predicate<T>(T obj)
- //查找所有以n结尾的对象 目前只有一个 aladdin
- Person[] rePers = Array.FindAll<Person>(pers, par1 => par1.name.LastIndexOf('n') > 0) ;
- Console.WriteLine( "查找以n结尾的人");
- foreach (Person p in rePers)
- {
- Console.WriteLine( p.name );
- }
- //ConvertAll方法 将一种对象,转换成为别一种对象。。例:我们要将Person类对象,转换成为Racer,只复制名字,不要年纪
- //public static TOutput[] ConvertAll<TInput, TOutput>(TInput[] array, Converter<TInput, TOutput> converter)
- //使用的泛型委托
- //public delegate TOutput Converter<TInput, TOutput>(TInput input)
- Racer[] races = Array.ConvertAll<Person, Racer>(pers, (param1) => new Racer(param1.name));
- Console.WriteLine( "输出被转换的人");
- foreach (Racer r in races)
- {
- Console.WriteLine( r.name );
- }
- Console.ReadLine() ;
- }
- }
- class Person : IComparable
- {
- public string name;
- public int age;
- public Person(string name, int age)
- {
- this.name = name;
- this.age = age;
- }
- #region IComparable 成员
- public int CompareTo(object obj)
- {
- Person per = obj as Person;
- if (per != null)
- {
- if (this.age == per.age)
- {
- return 0;
- }
- else if (this.age > per.age)
- {
- return 1;
- }
- else
- {
- return -1;
- }
- }
- else
- {
- return -1;
- }
- }
- #endregion
- }
- class Racer
- {
- public string name;
- public Racer(string name)
- {
- this.name = name;
- }
- }
- }