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

来源:互联网 发布:python中的生成器 编辑:程序博客网 时间:2024/05/22 05:10

代码编写及运行环境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}

运行结果:

原创粉丝点击