程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 為List添加排序的函數 處理並列排名情況(下篇)(1)

為List添加排序的函數 處理並列排名情況(下篇)(1)

編輯:關於C語言

在上篇文章中 我們完成了動態創建類型、動態設置值、動態獲取值、動態獲取屬性和返回值的一些方 法

准備工作完成了.. 我們現在來完成排序的功能

實現方式肯定還是擴展方法..

實現比較2個值的方法 我們可以給用戶提供. 我們不提供比較的方法 這樣設計靈活性更好..

用戶提供方法?? 怎麼實現  很簡單  2種方式  一種使用接口.. 另外一種使用的是委托..

我比較喜歡委托  我就使用委托的方式 .NET 中有預定於的委托 Comparison<T> 類型的委托   當然.Net 也定義了IComparer<T>接口作用也是一樣的

方法定義了2個參數.. 一個是比較值的委托.. 還有個是獲取名稱的字段...  具體名次計算就比較簡 單了...

public static IEnumerable<object> Rank<T>(this IEnumerable<T>  value, Comparison<T> comparsion, string orderName) where T : class
         {
             string orderColumn = "Rank";
             if (!string.IsNullOrEmpty(orderName))
             {
                 orderColumn = orderName;
             }
             List<T> list = value.ToList<T>();
             list.Sort(comparsion); // 排序  Sort方法排序後的結果是升序
             //反轉List中的數據  就變成降序了
             list.Reverse();
             List<object> returnlist = new List<object>();
             int order = 1;
             int pcount = 0;
             //構造一個動態類型
             Dictionary<string, string> dictionarytype =  TypeTransform(typeof(T));
             dictionarytype.Add(orderColumn, typeof(int).FullName);

             Type type = DynamicCreateType(dictionarytype, new string[]  { "System.dll", "System.Core.dll" });
             for (int i = 0; i < list.Count; i++)
             {

                 //獲得對象的屬性名稱和值 保存到Dictionary中
                 Dictionary<string, object> tempRank =  DynamicGetProperty(list[i]);
                 //添加名次的屬性和值
                 tempRank.Add(orderColumn, order);//添加名次和

                 returnlist.Add(DynamicSetProperty(type, tempRank));
                 if (i < list.Count - 1)
                 {
                     //獲得比較的結果
                     int t = i + 1;
                     int result = comparsion(list[i], list [t]);

                     if (result != 0)
                     {
                         if (pcount == 0)
                         {
                             order++;
                         }
                         else
                         {
                             order = order + 1 +  pcount;
                             pcount = 0;
                         }

                     }
                     else
                     {
                         pcount++;
                     }
                 }

             }
             return returnlist;
         }

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