• List<T>多字段排序的一个通用类


    本文中的方法旨在解决通用的问题,非常注重效率的地方,还应该针对具体的类去写排序方法。

    废话不多说,直接上代码

    具体使用场景:

    • 要排序的类
     1         public class bb
     2         {
     3             public aa a { get; set; }
     4         }
     5 
     6         public class aa
     7         {
     8             public string index { get; set; }
     9             public string name { get; set; }
    10 
    11             public aa(string index, string name)
    12             {
    13                 this.index = index;
    14                 this.name = name;
    15             }
    16         }
    • 使用CommentComparer类排序
     1             List<bb> list = new List<bb>()
     2             {
     3                 new bb(){a = new aa("13", "35")},
     4                 new bb(){a = new aa("14", "35")},
     5                 new bb(){a = new aa("12", "35")},
     6                 new bb(){a = new aa("14", "12")},
     7             };
     8 
     9             CommentComparer<bb> comparer = new CommentComparer<bb>();
    10             //comparer.IsAsc = true;
    11             //comparer.IsProperty = true;
    12             comparer.AddField("a.index");
    13             comparer.AddField("a.name");
    14 
    15             list.Sort(comparer);
    •  结果

    CommentComparer类具体实现

      1     /// <summary>
      2     /// 排序类
      3     /// </summary>
      4     /// <typeparam name="T"></typeparam>
      5     public class CommentComparer<T> : IComparer<T>
      6     {
      7         /// <summary>
      8         /// 字段列表
      9         /// </summary>
     10         private List<string> fieldList;
     11 
     12         /// <summary>
     13         /// 排序字段序号
     14         /// </summary>
     15         private int index = 0;
     16 
     17         /// <summary>
     18         /// 正序
     19         /// </summary>
     20         public bool IsAsc { get; set; }
     21 
     22         /// <summary>
     23         /// 使用字段的属性排序
     24         /// <para>False:使用字段排序</para>
     25         /// </summary>
     26         public bool IsProperty { get; set; }
     27 
     28         public CommentComparer()
     29         {
     30             fieldList = new List<string>();
     31             IsAsc = true;
     32             IsProperty = true;
     33             index = 0;
     34         }
     35 
     36         /// <summary>
     37         /// 添加排序使用的字段
     38         /// </summary>
     39         /// <param name="fieldName"></param>
     40         public void AddField(string fieldName)
     41         {
     42             fieldList.Add(fieldName);
     43         }
     44 
     45         public int Compare(T x, T y)
     46         {
     47             if (x == null)
     48             {
     49                 if (y == null)
     50                 {
     51                     return 0;
     52                 }
     53 
     54                 return 1;
     55 
     56             }
     57             if (y == null)
     58             {
     59                 return -1;
     60             }
     61 
     62             int result = -1;
     63 
     64             if (fieldList.Count < 1)
     65             { throw new FormatException("请添加排序所使用的字段!"); }
     66             if (index == 0 && !IsAsc)
     67             {
     68                 T temp;
     69                 temp = y;
     70                 y = x;
     71                 x = temp;
     72             }
     73 
     74             string[] field = fieldList[index].Split('.');
     75 
     76             dynamic p1 = GetValue<T>(x, field, 0);
     77             dynamic p2 = GetValue<T>(y, field, 0);
     78 
     79             result = Comparer<string>.Default.Compare(p1, p2);
     80             if (result == 0)
     81             {
     82                 index++;
     83                 if (fieldList.Count > index)
     84                 { result = Compare(x, y); }
     85                 index--;
     86             }
     87             return result;
     88         }
     89 
     90         /// <summary>
     91         /// 获取属性值
     92         /// </summary>
     93         /// <typeparam name="T"></typeparam>
     94         /// <param name="obj"></param>
     95         /// <param name="field"></param>
     96         /// <param name="i"></param>
     97         /// <returns></returns>
     98         private dynamic GetValue<T>(T obj, string[] field, int i)
     99         {
    100             dynamic result;
    101 
    102             Type t = typeof(T);
    103 
    104             if (IsProperty)
    105             {
    106                 PropertyInfo propertyInfo = t.GetProperty(field[i]);
    107                 result = propertyInfo.GetValue(obj, null);
    108             }
    109             else
    110             {
    111                 FieldInfo fieldInfo = t.GetField(field[i]);
    112                 result = fieldInfo.GetValue(obj);
    113             }
    114 
    115             if (i < field.Length - 1)
    116             {
    117                 result = GetValue(result, field, ++i);
    118             }
    119             return result;
    120         }
    121     }
    本文为博主原创,转载请注明出处,谢谢!
  • 相关阅读:
    5G 需要换 SIM 卡吗?
    多线程设计模式
    4G LTE/EPC UE 的附着与去附着
    4G EPS 的网络协议栈
    MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库
    MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库
    MYSQL远程登录权限设置 ,可以让Navicat远程连接服务器的数据库
    2018年要学习的10大Python Web框架
    2018年要学习的10大Python Web框架
    2018年要学习的10大Python Web框架
  • 原文地址:https://www.cnblogs.com/shiyingzheng/p/5959231.html
Copyright © 2020-2023  润新知