熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> ASP編程 >> 正文

Hashtable Dictionary的使用

2013-11-15 12:50:57  來源: ASP編程 

  要了解C#中Hashtable Dictionary的使用我們先來看一個例子!

  using System;

  using SystemCollections;

  namespace NoSortHashtable

  {

  /// <summary>

  /// Summary description for Class

  /// </summary>

  class Class

  {

  /// <summary>

  /// The main entry point for the application

  /// </summary>

  [STAThread]

  static void Main(string[] args)

  {

  Hashtable hashTable = new Hashtable();

  hashTableAdd(\hunan\\changsha\);

  hashTableAdd(\beijing\\beijing\);

  hashTableAdd(\anhui\\hefei\);

  hashTableAdd(\sichuan\\chengdu\);

  foreach(string str in hashTableKeys)

  {

  ConsoleWriteLine(str + \ : \ + hashTable[str]);

  }

  }

  }

  }

  打印的結果是

  anhui : hefei

  hunan : changsha

  sichuan : chengdu

  beijing : beijing

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

  

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

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

  在 Hashtable 中用作元素的每一對象必須能夠使用 GetHashCode 方法的實現為其自身生成哈希代碼但是還可以通過使用接受 IHashCodeProvider 實現作為參數之一的 Hashtable 構造函數為 Hashtable 中的所有元素指定一個哈希函數

  在將一個對象添加到 Hashtable 時它被存儲在存儲桶中該存儲桶與匹配該對象的哈希代碼的哈希代碼關聯在 Hashtable 內搜索一個值時將為該值生成哈希代碼並且搜索與該哈希代碼關聯的存儲桶

  例如一個字符串的哈希函數可以采用該字符串中每一字符的 ASCII 代碼並它們添加到一起來生成一個哈希代碼字符串picnic將具有與字符串basket的哈希代碼不同的哈希代碼因此字符串picnicbasket將處於不同的存儲桶中與之相比stresseddesserts將具有相同的哈希代碼並將處於相同的存儲桶中

  Dictionary 類與 Hashtable 類的功能相同對於值類型特定類型(不包括 Object)的 Dictionary 的性能優於 Hashtable這是因為 Hashtable 的元素屬於 Object 類型所以在存儲或檢索值類型時通常發生裝箱和取消裝箱操作中國自學編程網

  

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

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

  比如繼承hashtable使用不自動排序的arraylist做中間橋

  using System;

  using SystemCollections;

  namespace NoSortHashtable

  {

  public class NoSortHashtable : Hashtable

  {

  private ArrayList keys = new ArrayList();

  public NoSortHashtable()

  {

  }

  public override void Add(object key object value)

  {

  baseAdd (key value);

  keysAdd (key); [Page]

  }

  public override ICollection Keys

  {

  get

  {

  return keys;

  }

  }

  public override void Clear()

  {

  baseClear ();

  keysClear ();

  }

  public override void Remove(object key)

  {

  baseRemove (key);

  keysRemove     (key);

  }

  public override IDictionaryEnumerator GetEnumerator()

  {

  return baseGetEnumerator ();

  }

  }

  }

  或者

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

  using System;

  using SystemCollections;

  namespace testSortedList

  {

  class Class

  {

  [STAThread]

  static void Main(string[] args)

  {

  SortedList sl = new SortedList(new MySort());        //不排序 [Page]

  slAdd();

  slAdd();

  slAdd();

  slAdd();

  PrintList(sl);

  ConsoleReadLine();

  }

  private static void PrintList(SortedList sl)

  {

  for(int i=;i<slCount ;i++)

  {

  ConsoleWriteLine(\{}\\t{}\slGetKey(i)slGetByIndex(i));

  }//end for

  }//end fn()

  }

  public class MySort:IComparer

  {

  #region IComparer 成員

  public int Compare(object x object y)

  {

  return ;

  //排序

  //             int iResult = (int)x (int)y;

  //             if(iResult == ) iResult = ;

  //             return iResult;

  }

  #endregion

  }

  }

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

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

  using System;

  using SystemCollections;

  using SystemCollectionsSpecialized;

  using SystemCollectionsGeneric;

  namespace NoSortHashtable

  {

  /// <summary>

  /// Summary description for Class

  /// </summary>

  public class Class

  {

  /// <summary>

  /// The main entry point for the application

  /// </summary>

  [STAThread]

  static void Main(string[] args)

  {

  Hashtable ht = new Hashtable();

  htAdd(\hunan\\changsha\);

  htAdd(\beijing\\beijing\);

  htAdd(\anhui\\hefei\);

  htAdd(\sichuan\\chengdu\);

  foreach(string str in htKeys)

  {

  ConsoleWriteLine(str + \ : \ + ht[str]);

  }

  ConsoleWriteLine(\\);

  Dictionary<StringString> dic = new Dictionary<StringString>();

  dicAdd(\hunan\\changsha\); [Page]

  dicAdd(\beijing\\beijing\);

  dicAdd(\anhui\\hefei\);

  dicAdd(\sichuan\\chengdu\);

  foreach(string str in dicKeys)

  {

  ConsoleWriteLine(str + \ : \ + dic[str]);

  }

  ConsoleWriteLine(\\);

  ListDictionary lsdic = new ListDictionary();

  lsdicAdd(\hunan\\changsha\);

  lsdicAdd(\beijing\\beijing\);

  lsdicAdd(\anhui\\hefei\);

  lsdicAdd(\sichuan\\chengdu\);

  foreach(string str in lsdicKeys)

  {

  ConsoleWriteLine(str + \ : \ + lsdic[str]);

  }

  }

  }

  }


From:http://tw.wingwit.com/Article/program/ASP/201311/21738.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.