zoukankan      html  css  js  c++  java
  • List<T>泛型数组API自带的Sort() 排序方法根据自定义排序实现

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    using System.Reflection;

    namespace BLL
    {
        public class OrderHelper
        {
        }
        /// <summary>
        /// 继承IComparer<T>接口,实现同一自定义类型 对象比较
        /// </summary>
        /// <typeparam >T为泛用类型</typeparam>
        public class Reverser<T> : IComparer<T>
        {
            private Type type = null;
            private ReverserInfo info;

            /**/
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param >进行比较的类类型</param>
            /// <param >进行比较对象的属性名称</param>
            /// <param >比较方向(升序/降序)</param>
            public Reverser(Type type, string name, ReverserInfo.Direction direction)
            {
                this.type = type;
                this.info.name = name;
                if (direction != ReverserInfo.Direction.ASC)
                    this.info.direction = direction;
            }

            /**/
            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param >进行比较的类名称</param>
            /// <param >进行比较对象的属性名称</param>
            /// <param >比较方向(升序/降序)</param>
            public Reverser(string className, string name, ReverserInfo.Direction direction)
            {
                try
                {
                    this.type = Type.GetType(className, true);
                    this.info.name = name;
                    this.info.direction = direction;
                }
                catch (Exception e)
                {
                    throw new Exception(e.Message);
                }
            }

            /// <summary>
            /// 构造函数
            /// </summary>
            /// <param >进行比较的类型的实例</param>
            /// <param >进行比较对象的属性名称</param>
            /// <param >比较方向(升序/降序)</param>
            public Reverser(T t, string name, ReverserInfo.Direction direction)
            {
                this.type = t.GetType();
                this.info.name = name;
                this.info.direction = direction;
            }

            //必须!实现IComparer<T>的比较方法。
            int IComparer<T>.Compare(T t1, T t2)
            {
                object x = this.type.InvokeMember(this.info.name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, t1, null);
                object y = this.type.InvokeMember(this.info.name, BindingFlags.Public | BindingFlags.Instance | BindingFlags.GetProperty, null, t2, null);
                if (this.info.direction != ReverserInfo.Direction.ASC)
                    Swap(ref x, ref y);
                return (new CaseInsensitiveComparer()).Compare(x, y);
            }

            //交换操作数
            private void Swap(ref object x, ref object y)
            {
                object temp = null;
                temp = x;
                x = y;
                y = temp;
            }
        }

        /// <summary>
        /// 对象比较时使用的信息类
        /// </summary>
        public struct ReverserInfo
        {
            /// <summary>
            /// 比较的方向,如下:
            /// ASC:升序
            /// DESC:降序
            /// </summary>
            public enum Direction
            {
                ASC = 0,
                DESC,
            };

            public enum Target
            {
                CUSTOMER = 0,
                FORM,
                FIELD,
                SERVER,
            };

            public string name;
            public Direction direction;
            public Target target;
        }
    }

    (二)应用sort()方法:

    AgreementSheet abc = new AgreementSheet(); //new 一个当前处理的类
    Reverser<AgreementSheet> reverser = new Reverser<AgreementSheet>(abc.GetType(), "Customer Name in GSX", ReverserInfo.Direction.DESC);
    //"Customer Name in GSX":指定我们List<>泛型 类中一个要排序的列

    list.Sort(reverser); //即已经完成自定义排序了

    希望能帮助大家,谢谢!

  • 相关阅读:
    gcc 使用中常用的参数及命令
    Android build system & Android.mk 规范
    ndkgdb对java/native code联合调试
    Android NDK开发指南(一) Application.mk文件
    字符编码知识:Unicode、UTF8、ASCII、GB2312等编码 及 转换
    C & C++ 中值得注意的编译,链接,调试,错误及其原因
    JNI 调用规范
    Graphic 矢量图形的区域填充与缠绕规则
    Android NDK开发指南(二)Android.mk文件
    JNI 之二 :java & c/c++ 相互通信及调用
  • 原文地址:https://www.cnblogs.com/yonguibe/p/2632155.html
Copyright © 2011-2022 走看看