1. 程式人生 > >C#中字典的使用Dictionary

C#中字典的使用Dictionary

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. namespace 集合
  6. {
  7. class 字典
  8.     {
  9. publicstaticvoid Main()
  10.         {
  11. //字典也稱對映或者散列表,主要特點是可以根據鍵快速查詢值,也可以自由刪除新增元素
  12. //在刪除新增時,不會像列表一樣,移動之後的所有元素,產生記憶體的開銷。
  13. //.net中提供了幾個字典,可以使用最主要的類是Dictionary<TKey,TValue>
  14. //這個類與我們上面說的SortedList用法完全一樣,這裡不再多說了。
  15. //鍵的型別  
  16. //用做字典中鍵的型別必須重寫Object類中的GetHashCode()方法,只要字典類需要確定元素的位置,就要呼叫本方法
  17. //字典內部通過呼叫這個方法的返回值,來計算產生雜湊。。這個演算法不做介紹 ,但我要知道,它涉及到素數
  18. //所以字典的容量是一個素數
  19. //GetHashCode()方法的實現需要遵循以下幾點
  20. // 1 相同的物件應總是返回相同的值
  21. // 2 不同的物件可以返回相同的值
  22. // 3 應執行得比較快,計算的開銷不大。
  23. // 4 不能刨出異常
  24. // 5 應至少使用一個例項欄位
  25. // 6 雜湊碼值應平均分佈在int可以儲存的整個數字區上
  26. // 7 雜湊碼最好在物件的生存期中不發生變化
  27. //提示: 字典的效能取決於GetHashCode()方法的實現程式碼
  28.             Dictionary<EmployeeID , Employee> emps = new Dictionary<EmployeeID,Employee>(31) ;
  29.             EmployeeID idAladdin = new EmployeeID( "C7102" ) ;
  30.             Employee aladdin = new Employee( "aladdin" , 5000.00m , idAladdin ) ;
  31.             emps.Add( idAladdin , aladdin ) ;
  32.             Console.WriteLine( aladdin ) ;
  33.             EmployeeID idjacky = new EmployeeID( "C7106" ) ;
  34.             Employee jacky = new Employee( "jacky" , 5000.00m , idjacky ) ;
  35.             emps.Add( idjacky , jacky ) ;
  36.             Console.WriteLine( jacky ) ;
  37.             EmployeeID idzhao = new EmployeeID( "C8102" ) ;
  38.             Employee zhao = new Employee( "zhao" , 5000.00m , idzhao ) ;
  39.             emps.Add( idzhao , zhao ) ;
  40.             Console.WriteLine( zhao ) ;
  41.             EmployeeID idxiaofei = new EmployeeID( "C9102" ) ;
  42.             Employee xiaofei = new Employee( "xiaofei" , 5000.00m , idxiaofei ) ;
  43.             emps.Add( idxiaofei , xiaofei ) ;
  44.             Console.WriteLine( xiaofei ) ;
  45.             EmployeeID iddabi = new EmployeeID( "C7602" ) ;
  46.             Employee dabi = new Employee( "dabi" , 5000.00m , iddabi ) ;
  47.             emps.Add( iddabi , dabi ) ;
  48.             Console.WriteLine( dabi ) ;
  49.             EmployeeID idalong = new EmployeeID( "C7302" ) ;
  50.             Employee along = new Employee( "along" , 5000.00m , idalong ) ;
  51.             emps.Add( idalong , along ) ;
  52.             Console.WriteLine( along ) ;
  53.             EmployeeID idcarl = new EmployeeID( "C7402" ) ;
  54.             Employee carl = new Employee( "carl" , 5000.00m , idcarl ) ;
  55.             emps.Add( idcarl , carl ) ;
  56.             Console.WriteLine( carl ) ;
  57.             EmployeeID idjeff = new EmployeeID( "C7502" ) ;
  58.             Employee jeff = new Employee( "jeff" , 5000.00m , idjeff ) ;
  59.             emps.Add( idjeff , jeff ) ;
  60.             Console.WriteLine( jeff ) ;
  61.             EmployeeID iddenny = new EmployeeID( "C6602" ) ;
  62.             Employee denny = new Employee( "denny" , 5000.00m , iddenny ) ;
  63.             emps.Add( iddenny , denny ) ;
  64.             Console.WriteLine( denny ) ;
  65.             EmployeeID idmatt = new EmployeeID( "C7701" ) ;
  66.             Employee matt = new Employee( "matt" , 5000.00m , idmatt ) ;
  67.             emps.Add( idmatt , matt ) ;
  68.             Console.WriteLine( matt ) ;
  69.             Console.ReadLine() ;
  70.         }
  71.     }
  72. struct EmployeeID : IEquatable<EmployeeID>
  73.     {
  74. privatereadonlychar prefix ;
  75. privatereadonlyint number ;
  76. public EmployeeID( string id )
  77.         {
  78. this.prefix = (id.ToUpper())[0] ;
  79. int numLength = id.Length - 1 ;
  80. this.number = int.Parse( id.Substring( 1 , numLength > 6 ? 6 : numLength ) ) ;
  81.         }
  82. publicoverridestring ToString()
  83.         {
  84. returnthis.prefix.ToString() + string.Format( "{0,6:000000}" , number ) ;
  85.         }
  86. publicoverrideint GetHashCode()
  87.         {
  88. return ( number ^ number << 16 ) * 0x15051505 ;
  89.         }
  90. publicbool Equals( EmployeeID other )
  91.         {
  92. return (  other.number == this.number && this.prefix == other.prefix  ) ;
  93.         }
  94.     }
  95. class Employee
  96.     {
  97. privatestring name ;
  98. privatedecimal salary ;
  99. privatereadonly EmployeeID id ;
  100. public Employee( string name , decimal salary , EmployeeID id ) 
  101.         {
  102. this.name = name ;
  103. this.salary = salary ;
  104. this.id = id ;
  105.         }
  106. publicoverridestring ToString()
  107.         {
  108. returnstring.Format( "{0} : {1,-20} {2:C}" , id.ToString() , name,salary ) ;
  109.         }
  110.     }
  111. }