zoukankan      html  css  js  c++  java
  • list<T>中的按特定顺序排序

      前段时间有个任务,就是把参数要按特定顺序排序,就是要是在一张大的参数表中,只选取,2,5,12,9,13,10 这几个参数,并按上述顺序进行排序。

     假设这个参数在一个类中。例如: 上述参数序列就存在ParamIndex。

       

    public class ParamDemo
            {
                
                public int ParamIndex { get; set; }
                public string ParamName{ get; set; }
                public string ParamType { get; set; }
    
            }

    假设有个List 

     List<ParamDemo> Params = new List<ParamDemo>();

    设置这个排序,需要的是 List<T>.Sort 方法 (IComparer<T>),http://msdn.microsoft.com/zh-cn/library/vstudio/234b841s.aspx

    msdn上有一些描述,但是在我手头上的一些c#的书上面都是没有相关的叙述的,还是幸好有同事可以询问,解决了这个问题。

    我姑且把这个排序分为三个部分。

    1、以 ParamIndex这个值为HashTable的key,构建一个哈希表,来实现上述的顺序,比如说

          hash[2] =100

      hash[5] =99

          hash[12] =98

          hash[9] =97

          hash[13] =96

          hash[10] =95

          表述的不是很清楚,但是更像c里面的指针,一个变量,自身有值,且还能指一个值(貌似更加不清楚了)。其实可以不用HashTable,但是为了预防将来的参数会增多,故选择了HashTable。

         具体表述如下:

        

     int[] numbers = new int[]{2,5,12,9,13,10};
                Hashtable hash = new Hashtable();
                for (int i = 0; i < numbers.Length; i++)
                {
                    hash[numbers[i]] = (100 - i);
     
                }

    随便给我一个参数顺序,都可以加入到HashTable中然后就按这个顺序排序。

    2、构建 能够使用List().sort() (IComparer<T>).

     这个有不少关键点 ,比较容易的是 这个类必须有IComparer这个接口(我现在不是很清楚什么是接口);上面那一段 数组 哈希表的那一块,必须放在Compare函数里;

    这个类必须有Compare函数;这个函数必须要返回 -1 1 0要不就会出错; -1表示小于,1表示大于,0表示等于;其实可以更简单更加简化(后面在补充 2013-07-08),但是觉得容易逻辑上疑惑,所以我更喜欢分开写。

    public class ParamComparer : IComparer<ParamDemo>
        {
    
    
            public int Compare(ParamDemo para1, ParamDemo para2)
            {
                int[] numbers = new int[] { 2, 5, 12, 9, 13, 10 };
                Hashtable hash = new Hashtable();
                for (int i = 0; i < numbers.Length; i++)
                {
                    hash[numbers[i]] = (100 - i);
    
                }
                if ((int)hash[para1.ParamIndex] < (int)hash[para2.ParamIndex])
                { return -1; }
                if ((int)hash[para1.ParamIndex] > (int)hash[para2.ParamIndex])
                { return 1; }
    
                return 0;
            }
           
        }

    能不能把数组声明和 hashtable放在外面但是 这个函数是能用到的。

    3、进行排序

      

      List<ParamDemo> Params = new List<ParamDemo>();
                ParamComparer pce = new ParamComparer();
                Params.Sort(pce);

    好了 先暂时告一段落,没有全部贴出代码的问题就是,可能全部的代码就会出问题。

    先这样吧

  • 相关阅读:
    读《大道至简》第二章有感
    《大道至简》读后感
    JAVA课后作业
    大道至简第三章观后感
    JAVA作业之两数的加减乘除
    JAVA作业之动手动脑
    第一次Java实验
    大道至简第二章观后感
    大道至简第一章观后感
    Django__admin的配置
  • 原文地址:https://www.cnblogs.com/young-ma/p/3178183.html
Copyright © 2011-2022 走看看