在上篇文章中 我們完成了動態創建類型、動態設置值、動態獲取值、動態獲取屬性和返回值的一些方 法
准備工作完成了.. 我們現在來完成排序的功能
實現方式肯定還是擴展方法..
實現比較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>
顯示效果