程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> .NET(C#) Hashtable Dictionary 探索

.NET(C#) Hashtable Dictionary 探索

編輯:.NET實例教程
先看下面的代碼



using System;
using
System.Collections;

namespace
NoSortHashtable
{
    /// <summary>

    /// Summary description for Class1.
    /// </summary>

    class Class1
     {
        /// <summary>

        /// The main entry point for the application.
        /// </summary>

         [STAThread]
        static void Main(#0000ff">string
[] args)
         {
             Hashtable hashTable = new
Hashtable();

             hashTable.Add("hunan","changsha"
);
             hashTable.Add("beijing","beijing"
);
             hashTable.Add("anhui","hefei"
);
             hashTable.Add("sichuan","chengdu"
);
           

"COLOR: #0000ff">foreach(string str in hashTable.Keys)
             {
                 Console.WriteLine(str + " : " +
hashTable[str]);
             }

         }
     }
}


打印的結果是:
    
anhui : hefei
     hunan : changsha
     sichuan : chengdu
     beijing : beijing


為何產生這樣的結果? 我查了MSDN後發現
----------------------------------------------------------------------------------------------------

Hashtable 對象由包含集合元素的存儲桶組成。存儲桶是 Hashtable 中各元素的虛擬子組,與大多數集合中進行的搜索和檢索相比,存儲桶可令搜索和檢索更為便捷。每一存儲桶都與一個哈希代碼關聯,該哈希代碼是使用哈希函數生成的並基於該元素的鍵。

哈希函數是基於鍵返回數值哈希代碼的算法。鍵是正被存儲的對象的某一屬性的值。哈希函數必須始終為相同的鍵返回相同的哈希代碼。一個哈希函數能夠為兩個不同的鍵生成相同的哈希代碼,但從哈希表檢索元素時,為每一唯一鍵生成唯一哈希代碼的哈希函數將令性能更佳。

Hashtable 中用作元素的每一對象必須能夠使用 )的 Dictionary 的性能優於 Hashtable,這是因為 Hashtable 的元素屬於 Object 類型,所以在存儲或檢索值類型時通常發生裝箱和取消裝箱操作。

----------------------------------------------------------------------------------------------------


產生這個結果的原因就是Hashtable內部的排序機制使然,但我現在就是不想排序,我按什麼順序輸入的,就想它再怎麼給我輸出,怎麼辦?

google後發現幾個可以解決的辦法,不過都需要自己寫代碼實現

比如,繼承hashtable,使用不自動排序的arraylist做中間橋
using System;
using
System.Collections;

namespace
NoSortHashtable
{
    public class
NoSortHashtable : Hashtable
   
{
        private ArrayList keys = new
ArrayList();

        public
NoSortHashtable()
        

TTOM: #808080 1px solid; BACKGROUND-COLOR: #ffffff">{
         }


        public override void Add(object key, object value)
        
{
            base
.Add (key, value);
           &nbsp; keys.Add (key);
         }


        public override ICollection Keys
        
{
            get

       &nbsp;    {
                return
keys;
             }

         }

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


        public override void Remove(object key)
      

;  
{
            base
.Remove (key);
             keys.Remove     (key);
        }

        public override IDictionaryEnumerator GetEnumerator()
        
{
            return base
.GetEnumerator ();
         }


     }
}

或者
只要Compare函數的返回結果不等於0就可以添加相同的Key,這樣可以實現既可以排序,又可以有相同的Key值,可能在某些情況下會用得到。


using System;
using
System.Collections;

namespace
testSortedList
{
    class
Class1
     {
         [STAThread]
        static void Main(string
[] args)
         {
             SortedList sl = new SortedList(new MySort());        //不排序

             sl.Add(333,333);
             sl.Add(111,111
);
             sl.Add(222,222
);

/>             sl.Add(111,112);

             PrintList(sl);

             Console.ReadLine();
         }

        private static void
PrintList(SortedList sl)
         {
            for(int i=0;i<sl.Count ;i++
)
             {
                 Console.WriteLine("{0}\t{1}"
,sl.GetKey(i),sl.GetByIndex(i));
             }//end for

         }//end fn()

">

     }
    
public class MySort:IComparer
     {
        #region IComparer 成員

        public int Compare(object x, object y)
         {
            return -1
;

            //
排序
//
             int iResult = (int)x - (int)y;
//
             if(iResult == 0) iResult = -1;
//             return iResult;


         }


        
#endregion
     }

}


使用單鏈接列表實現 IDictionary。建議用於通常包含 10 個或 10 個以下項的集合。

最後我測試了使用泛類型的Dictionary<T,T>, 盡管msdn上說hashtable和Dictionary的實現是一樣的,不過同樣的數據,返回的結果卻是不同的,我沒有找到更多的解釋,測試代碼如下

using System;
using System.Collections;
using System.Collections.Specialized;
using System.Collections.Generic;

namespace NoSortHashtable
{
     /// <summary>
     /// Summary description for Class1.
     /// </summary>
     public class Class1
     {
         /// <summary>
         /// The main entry point for the application.
         /// </summary>
         [STAThread]
         static void Main(string[] args)
         {
             Hashtable ht = new Hashtable();
             ht.Add("hunan","changsha");
             ht.Add("beijing","beijing");
             ht.Add("anhui","hefei");
    &nbsp;        ht.Add("sichuan","chengdu");
             foreach(string str in ht.Keys)
             {
                 Console.WriteLine(str + " : " + ht[str]);
             }    
            
             Console.WriteLine("------------------------------------");
               
             Dictionary<String,String> dic = new Dictionary<String,String>();
             dic.Add("hunan","changsha");
             dic.Add("beijing","beijing");
             dic.Add("anhui","hefei");
             dic.Add("sichuan","chengdu");
             foreach(string str in dic.Keys)
             {
                 Console.WriteLine(str + " : " + dic[str]);
             }
            
             Console.WriteLine("------------------------------------");
               
    

;         ListDictionary lsdic = new ListDictionary();
             lsdic.Add("hunan","changsha");
             lsdic.Add("beijing","beijing");
             lsdic.Add("anhui","hefei");
             lsdic.Add("sichuan","chengdu");
             foreach(string str in lsdic.Keys)
             {
                 Console.WriteLine(str + " : " + lsdic[str]);
             }
        }
   }
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved