Hashtable 排序

Hashtable本身并没有排序功能,相对来说,它的主要优点在于快速查找。
但有的时候我们也需要对Hashtable里面的元素进行排序,这就需要变通的方法来实现。
大家都知道:ArrayList它有一个Sort()方法,可以将里面的元素进行排序,试想如果将Hashtable里面的元素导入到ArrayList里面,然后再进行排序,这倒是一个不错的想法,现在我们加以实现:
using System;
using System.Collections;

namespace PublicBill.HashtableSort
{
    
public class HashtableSort
    
{
        
public static void Main()
        
{
            
string myString = "1,AAA;2,BBB;3,CCC";
            
string[] myStringArray = myString.Split(';');
            
string[] mySubStringArray;
            Hashtable ht 
= new Hashtable();
            
foreach(string str in myStringArray)
            
{
                mySubStringArray 
= str.Split(',');
                ht.Add(mySubStringArray[
0], mySubStringArray[1]);
            }


            Console.WriteLine(
"Hashtable before sort.");
            
foreach(DictionaryEntry de in ht)
            
{
                Console.WriteLine(
"{0}: {1}", de.Key, de.Value);
            }


            ArrayList al 
= new ArrayList(ht.Keys);
            al.Sort();
            Console.WriteLine();

            Console.WriteLine(
"Hashtable after sort.");
            
foreach(string key in al)
            
{
                Console.WriteLine(
"{0}: {1}", key, ht[key]);
            }

        }

    }

}

程序运行结果见图一:
       
排序完成了,但是像图二那样,要实现反向排序(倒序)该如何操作?
好像ArrayList里面也就仅仅提供了一个Sort()方法,没有提供给我们直接倒序的方法,
废话少说,见如下代码: 
using System;
using System.Collections;

namespace PublicBill.HashtableSort
{
    
public class HashtableSort
    
{
        
public static void Main()
        
{
            
string myString = "1,AAA;2,BBB;3,CCC";
            
string[] myStringArray = myString.Split(';');
            
string[] mySubStringArray;
            Hashtable ht 
= new Hashtable();
            
foreach(string str in myStringArray)
            
{
                mySubStringArray 
= str.Split(',');
                ht.Add(mySubStringArray[
0], mySubStringArray[1]);
            }


            Console.WriteLine(
"Hashtable before sort.");
            
foreach(DictionaryEntry de in ht)
            
{
                Console.WriteLine(
"{0}: {1}", de.Key, de.Value);
            }


            ArrayList al 
= new ArrayList(ht);
            CustomComparer comparer 
= new CustomComparer();
            al.Sort(comparer);

            Console.WriteLine(); 
//Print a empty line.

            Console.WriteLine(
"Hashtable after order by desc.");
            
foreach(DictionaryEntry de in al)
            
{
                Console.WriteLine(
"{0}: {1}", de.Key, de.Value);
            }


        }


    }



    
public class CustomComparer : IComparer
    
{
        
public int Compare(object x, object y)
        
{
            
int r = 0;

            
if (x is DictionaryEntry && y is DictionaryEntry)
            
{
                DictionaryEntry a 
= (DictionaryEntry)x;
                DictionaryEntry b 
= (DictionaryEntry)y;
            
                
if (a.Key is IComparable)
                
{
                    
//If you want sort asc,only need remove "-".
                    r = -((IComparable)a.Key).CompareTo(b.Key);
                }

            }

    
            
return r;
        }

    }

}

程序运行结果见图二。
说 明:  
   如果你想实现升序,只需要把
   r = -((IComparable)a.Key).CompareTo(b.Key); 前面的负号去掉, 
   改为: r = ((IComparable)a.Key).CompareTo(b.Key); 
   (注:以上代码得到了 破宝 的指导)
原文地址:https://www.cnblogs.com/publicbill/p/253317.html