首页 / 软件开发 / C# / 为List添加排序的函数 处理并列排名情况(下篇)
为List添加排序的函数 处理并列排名情况(下篇)2011-07-27 博客园 陈亮在上篇文章中 我们完成了动态创建类型、动态设置值、动态获取值、动态获取属性和返回值的一些方 法准备工作完成了.. 我们现在来完成排序的功能实现方式肯定还是扩展方法..实现比较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;
}