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