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

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

編輯:關於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;
         }

這樣就完成了自定義排序的方法

我們來看看使用效果

實體類

public class CityInfo
{
     public string City { get; set; }

     public float Salary { get; set; }
}

綁定

 if (!IsPostBack)
         {
             var s = new List<CityInfo> { 
                 new CityInfo(){ City = "上海",Salary=8000f },  
                new CityInfo() { City = "杭州",Salary=8000f },  
                 new CityInfo() { City = "北京",Salary=6000f },  
                 new CityInfo() { City = "廣州",Salary=6000f },  
                 new CityInfo() { City = "深圳",Salary=4000f },  
                 new CityInfo() { City = "成都",Salary=2000f },
                 new CityInfo() { City = "武漢",Salary=2000f }
             };
             this.GridView1.DataSource = s.Rank<CityInfo>((c, c1)  => c.Salary.CompareTo(c1.Salary), "位次");
             this.GridView1.DataBind();

前台代碼

<asp:GridView ID="GridView1" runat="server" BackColor="White" Width="40%" 
             BorderColor="#67DB4A" BorderStyle="None" BorderWidth="1px"  CellPadding="4">
             <RowStyle BackColor="White" ForeColor="#003399" />
             <FooterStyle BackColor="#99CCCC" ForeColor="#003399" />
             <PagerStyle BackColor="#99CCCC" ForeColor="#003399" HorizontalAlign="Left" />
             <SelectedRowStyle BackColor="#009999" Font-Bold="True" ForeColor="#CCFF99" />
             <HeaderStyle BackColor="#003399" Font-Bold="True" ForeColor="#CCCCFF" />
         </asp:GridView>

顯示效果

City Salary 位次 杭州 8000 1 上海 8000 1 北京 6000 3 廣州 6000 3 深圳 4000 5 武漢 2000 6 成都 2000 6
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved