通過代碼學習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
}

運行結果:

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