通过代码学习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
}

运行结果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章