阿赛·游梦鱼·郭言赛·阿赛工作室
全站技术源码素材

为List添加排序的函数 处理并列排名情况(下篇)

  •  字体:
  • 在上篇文章中我们完成了动态创建类型、动态设置值、动态获取值、动态获取属性和返回值的一些方法准备工作完成了..我们现在来完成排序的功能实现方式肯定还是扩展方法..实现比较2个值的方法我们可以给用户提供.我们不提供比较的方法这样设计灵活性更好..用户提供方法??怎么实现 很简单 2种方式 一种使用接口..另外一种使用的是委托..我比较喜欢委托 我就使用委托的方式 .NET中有预定于的委托Compari
  • 在上篇文章中 我们完成了动态创建类型、动态设置值、动态获取值、动态获取属性和返回值的一些方 法

    准备工作完成了.. 我们现在来完成排序的功能

    实现方式肯定还是扩展方法..

    实现比较2个值的方法 我们可以给用户提供. 我们不提供比较的方法 这样设计灵活性更好..

    用户提供方法?? 怎么实现  很简单  2种方式  一种使用接口.. 另外一种使用的是委托..

    我比较喜欢委托  我就使用委托的方式 .NET 中有预定于的委托 Comparison 类型的委托   当然.NET 也定义了IComparer接口作用也是一样的

    方法定义了2个参数.. 一个是比较值的委托.. 还有个是获取名称的字段...  具体名次计算就比较简 单了...

    public static IEnumerable Rank(this IEnumerable  value, Comparison comparsion, string orderName) where T : class
             {
                 string orderColumn = "Rank";
                 if (!string.IsNullOrEmpty(orderName))
                 {
                     orderColumn = orderName;
                 }
                 List list = value.ToList();
                 list.Sort(comparsion); // 排序  Sort方法排序后的结果是升序
                 //反转List中的数据  就变成降序了
                 list.Reverse();
                 List returnlist = new List();
                 int order = 1;
                 int pcount = 0;
                 //构造一个动态类型
                 Dictionary 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               {

                     //获得对象的属性名称和值 保存到Dictionary中
                     Dictionary tempRank =  DynamicGetProperty(list[i]);
                     //添加名次的属性和值
                     tempRank.Add(orderColumn, order);//添加名次和

                     returnlist.Add(DynamicSetProperty(type, tempRank));
                     if (i                   {
                         //获得比较的结果
                         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;
             }


    MapSiteMapRssGoTop