程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 自己實現一個Comparer

自己實現一個Comparer

編輯:.NET實例教程
雖然在.Net類庫裡有System.Collections.Generic.Comparer<>這個基礎比較器,但是我用起來覺得不爽.因為如果是自定義類型還要繼承並實現IComparer<>接口實現一個特定的比較器太麻煩了,再者我不喜歡動不動就繼承接口這種理論的面向對象編程方式.所以就自己寫個Comparer看著舒心用著踏實.
    自己寫比較器只要能實現兩個功能就行,1能支持基礎類型,2能夠方便擴展自定義類型.基於此我使用委托(System.Comparison<>).實現思路很簡單在類裡使用一個Dictionary來保存類型和Delegate的鍵值對.在類的靜態構造裡初始化基礎類型的Comparison,自定義類型通過由用戶實現並添加到Dictionary中.
    為什麼要用Delegate來做值呢?因為Comparison<int>,Comparison<double>是不同的類型所以只能使用委托的基類Delegate來代替這些具體類型(Array,Enum同理).在使用的時候只要轉下類型就ok了,這個沒有什麼性能損失.這個比較器還要使用單例模式這樣就完美了.
代碼:
    public class BComparer<T>
    {
        Comparison<T> _comparison;                  //比較委托
        static readonly Dictionary<Type, Delegate> _map = new Dictionary<Type, Delegate>();  
        //實現單例
        static readonly BComparer<T> _instance = new BComparer<T>();      
        private BComparer() {}
        public static BComparer<T> Instance
        {
            get
            {
                System.Diagnostics.Debug.Assert(_map.ContainsKey(typeof(T)));
                //強轉為具體的比較委托
                _instance._comparison = (Comparison<T>)_map[typeof(T)];
                return _instance;
            }
        }
        //情態構造,

$False$

初始化
        static BComparer()
        {
            //基礎類型比較器
            Type t = typeof(T);
            if (t == typeof(bool))
            {
                Comparison<bool> cmp_bool = delegate(bool t1, bool t2)
                                    { return t1 == t2 ? 0 : (t1 ? 1 : -1); };
                _map.Add(typeof(bool), (Delegate)cmp_bool);
            }      
            if (t == typeof(int))
            {
                Comparison<int> cmp_int = delegate(int t1, int t2)
                                    { return t1 > t2 ? 1 : (t1 == t2 ? 0 : -1); };
                _map.Add(typeof(int), (Delegate)cmp_int);
            }         
            //....其他
         }
         //注冊自定義比較
        public static void Register<NT>(Comparison<NT> comparison)
&nbsp;       {
            System.Diagnostics.Debug.Assert(_map.ContainsKey(typeof(NT)) == false);

            _map.Add(typeof(NT), (Delegate)comparison);
        }
        //比較函數,以後用來實現IComparer用
        public int Compare(T t1, T t2)
        {
            System.Diagnostics.Debug.Assert(_comparison != null);

            return _comparison(t1, t2);           
        }

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved