让Hashtable支持自定义排序(转)

  很多文章都有写到Hashtable有内部的排序机制,如果要自定义排序的话就要自己写算法来实现的:听起来很抽象,我一向喜欢简单实用的东西,我下面就来总结总结怎样来实现自定义排序Hashtable.
先看看普通的Hashtable的基本实现:

  public static void Main()
        
{
            Hashtable ht 
= new Hashtable();

            ht.Add(
"key1""value1");
            ht.Add(
"key2""value2");
            ht.Add(
"key3""value3");
            ht.Add(
"key4""value4");
            ht.Add(
"key5""value5");
            
foreach (string str in ht.Keys)
            
{
                Console.WriteLine(str 
+ ":" + ht[str]);
            }

        }


运行的结果:

产生这个结果的原因大家都知道,Hashtable内部的排序机制使然.
下面我来说说在平时的遇到的几种排序类型以及实现:
一、我按什么顺序加进去就按什么顺序输出:

  public class NoSortHashTable : Hashtable
        
{
            
private ArrayList list = new ArrayList();
            
public override void Add(object key, object value)
            
{
                
base.Add(key, value);
                list.Add(key);
            }

            
public override void Clear()
            
{
                
base.Clear();
                list.Clear();
            }

            
public override void Remove(object key)
            
{
                
base.Remove(key);
                list.Remove(key);
            }

            
public override ICollection Keys
            
{
                
get
                
{
                    
return list;
                }

            }

这里注意:ArrayList是不排序的(添加的顺序就是输出的顺序)。让它和hashtable结合不就实现这种功能的吗?这样继承了Hashtable具有Hashtable的丰富功能,又满足ArrayList不排序的功能。满足我们的要求。

  public static void Main()
        
{
            NoSortHashTable ht 
= new NoSortHashTable();

            ht.Add(
"key1""value1");
            ht.Add(
"key2""value2");
            ht.Add(
"key3""value3");
            ht.Add(
"key4""value4");
            ht.Add(
"key5""value5");
            
foreach (string str in ht.Keys)
            
{
                Console.WriteLine(str 
+ ":" + ht[str]);
            }

        }

这样一运行就满足我的要求了:
成功了!
二、我按Hashtable中键的大小顺序进行排序
 实际上是按照每一个字符的ASCII的值就行排序的。从左到右比较每个字符的Ascii的值,直到满足两个字符的ASCII的值不同即停止比较

  public static void Main()
        
{
            Hashtable ht 
= new Hashtable();

            ht.Add(
"ee""value1");
            ht.Add(
"dd""value2");
            ht.Add(
"cc""value3");
            ht.Add(
"bb""value4");
posted @ 2010-06-21 13:03  雨戈  阅读(243)  评论(0)    收藏  举报