通过代码学习C#&.NET——委托使用(通用类设计)

代码编写及运行环境Visual Studio 2010 .NET v4.0.30319

 using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
 
namespace DelegateUseInCommonClass 

    /// <summary> 
    /// 一般通用类的设计都包含一些标准的任务代码,这些代码包含任务如何执行的逻辑,但是有的时候这些任务包含一些 
    /// 子任务,只有具体使用通用类的对象才知道如何执行这些子任务,比如说: 
    /// 建立了一个给对象排序的通用类,在使用的时候需要知道具体的排序规则才能顺利完成排序,比如int对象是比较大小, 
    /// string对象是比较第一个字母,一些复杂对象可能是比较其中的某个属性值完成排序。 
    /// 这种情况可以通过委托实现,对于子任务使用委托,可以方便通用类的使用者具体执行执行子任务的方式。 
    /// </summary> 
    class Program 
    { 
        static void Main(string[] args) 
        { 
            //定义并初始化不同类型的三个数组 
            int[] intItems = { 12, 2, 4, 5, 78, 32, 12, 65 }; 
            string[] stringItems = { "test", "best", "active", "card", "book" }; 
            Person[] personItems = { new Person(12, "Mark"), new Person(45, "Mary"), new Person(32, "Oscar"), new Person(80, "Kele"),new Person(12,"Ada") }; 
 
 
            #region Int类型的排序             
             
            Console.WriteLine("intItems排序前:"); 
            Console.Write("  "); 
            foreach (int i in intItems) 
            { 
                Console.Write(string.Format("{0,-4}", i)); 
            } 
            Console.WriteLine(); 
            //给intItems排序 
            CommonClass.Sort<int>(intItems, (item1, item2) =>  
                {  
                    if (item1 > item2) 
                        return true; 
                    else  
                        return false; 
                }); 
            Console.WriteLine("intItems按Int值从小到大排序后:"); 
            Console.Write("  "); 
            foreach (int i in intItems) 
            { 
                Console.Write(string.Format("{0,-4}", i)); 
            } 
            Console.WriteLine(); 
 
            #endregion 
 
            #region String类型的排序 
            Console.WriteLine("stringItems排序前:"); 
            Console.Write("  "); 
            foreach (string str in stringItems) 
            { 
                Console.Write(string.Format("{0,-10}", str)); 
            } 
            Console.WriteLine(); 
            //给stringItems排序 
            CommonClass.Sort<string>(stringItems, (item1, item2) =>  
                { 
                if (item1.CompareTo(item2) > 0) 
                    return true;  
                else 
                    return false;  
                }); 
            Console.WriteLine("stringItems按string首字母排序后:"); 
            Console.Write("  "); 
            foreach (string str in stringItems) 
            { 
                Console.Write(string.Format("{0,-10}",str)); 
            } 
            Console.WriteLine(); 
 
            #endregion 
 
            #region Person类型的排序             
             
            Console.WriteLine("personItems排序前:");             
            foreach (Person per in personItems) 
            { 
                Console.WriteLine(string.Format("  Person:  Name-{0,-10}Age-{1}",per.Name,per.Age)); 
            }             
            CommonClass.Sort<Person>(personItems, (item1, item2) => 
                { 
                    if (item1.Age > item2.Age) 
                        return true; 
                    else 
                        return false; 
                }); 
            Console.WriteLine("personItems按年龄从小到大排序后:"); 
            foreach (Person per in personItems) 
            { 
                Console.WriteLine(string.Format("  Person:  Name-{0,-10}Age-{1}", per.Name, per.Age)); 
            } 
            CommonClass.Sort<Person>(personItems, (item1, item2) => 
                { 
                    if (item1.Name.CompareTo(item2.Name)>0) 
                        return true; 
                    else 
                        return false; 
                }); 
            Console.WriteLine("personItems按姓名首字母排序后:"); 
            foreach (Person per in personItems) 
            { 
                Console.WriteLine(string.Format("  Person:  Name-{0,-10}Age-{1}", per.Name, per.Age)); 
            } 
 
            #endregion 
        } 
 
        //定义Person类 
        class Person 
        { 
            private int _Age; 
            private string _Name; 
 
            public int Age 
            { 
                get 
                { 
                    return _Age; 
                } 
                set 
                { 
                    _Age = value; 
                } 
            } 
            public string Name 
            { 
                get 
                { 
                    return _Name; 
                } 
                set 
                { 
                    _Name = value; 
                } 
            } 
 
            public Person(int age, string name) 
            { 
                _Age = age; 
                _Name = name; 
            } 
        } 
    } 
 
    #region 比较通用类设计 
    /// <summary> 
    /// 此处使用排序来说明委托在通用类中的使用,此方法在多本C#说中都有介绍,包括: 
    /// 《C#本质论》 
    /// 《C#高级编程》 
    /// </summary> 
    class CommonClass 
    { 
        //定义用于比较两个对象并返回bool类型的委托类型 
        public delegate bool Compare<T>(T item1, T item2); 
 
        //通用排序方法,可以用于比较任何对象,具体比较结果依赖于子任务Compare<T>类型的compare 
        public static void Sort<T>(T[] items, Compare<T> compare) 
        { 
            for (int i = 0; i < items.Count()-1; i++) 
            { 
                for (int j = i; j < items.Count(); j++) 
                { 
                    if (compare(items[i], items[j])) 
                    { 
                        T temp = items[i]; 
                        items[i] = items[j]; 
                        items[j] = temp; 
                    } 
                } 
            } 
        } 
    } 
    #endregion 

运行结果:

 \

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值