`
pcajax
  • 浏览: 2173485 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Hashtable Dictionary的使用

阅读更多

要了解C#中Hashtable Dictionary的使用,我们先来看一个例子!


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(string[] args)
         {
             Hashtable hashTable = new Hashtable();

             hashTable.Add(\"hunan\",\"changsha\");
             hashTable.Add(\"beijing\",\"beijing\");
             hashTable.Add(\"anhui\",\"hefei\");
             hashTable.Add(\"sichuan\",\"chengdu\");
            foreach(string str in hashTable.Keys)
             {
                 Console.WriteLine(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”的哈希代码不同的哈希代码;因此,字符串“picnic”和“basket”将处于不同的存储桶中。与之相比,“stressed”和“desserts”将具有相同的哈希代码并将处于相同的存储桶中。
Dictionary 类与 Hashtable 类的功能相同。对于值类型,特定类型(不包括 Object)的 Dictionary 的性能优于 Hashtable,这是因为 Hashtable 的元素属于 Object 类型,所以在存储或检索值类型时通常发生装箱和取消装箱操作,中国自学编程网, www.zxbc.cn 。
----------------------------------------------------------------------------------------------------
产生这个结果的原因就是Hashtable内部的排序机制使然,但我现在就是不想排序,我按什么顺序输入的,就想它再怎么给我输出,怎么办?
google后发现几个可以解决的办法,不过都需要自己写代码实现
比如,继承hashtable,使用不自动排序的arraylist做中间桥
using System;
using System.Collections;

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

        public NoSortHashtable()
        {
         }
public override void Add(object key, object value)
        {
            base.Add (key, value);
             keys.Add (key); [Page]
         }

        public override ICollection Keys
        {
            get
            {
                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());        //不排序 [Page]
             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的实现是一样的,不过同样的数据,返回的结果却是不同的,我没有找到更多的解释,测试代码如下 [Page]
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\");
             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\"); [Page]
             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]);
             }
        }
   }
}

分享到:
评论

相关推荐

    hashtable和dictionary的探讨

    在编程领域,哈希表(Hashtable)和字典(Dictionary)是两种常用的数据结构,它们在存储和检索键值对时提供了高效的性能。本文将深入探讨这两种数据结构的原理、性能差异以及实际应用中的考虑因素。 哈希表,通常...

    Hashtable的使用

    `Hashtable`是`Dictionary`类的一个子类,它不支持`null`键或`null`值。这个类实现了`Map`接口,允许我们通过键来存储和检索对象。本文将详细介绍`Hashtable`的基本用法,包括插入元素、查找元素、遍历以及其相关...

    c#数据结构之array,arraylist,hashtable,dictionary

    C#数据结构之Array、ArrayList、Hashtable、Dictionary C#中有多种数据结构可以用来存储和管理数据,今天我们将讨论四种常用的数据结构:Array、ArrayList、Hashtable和Dictionary。这些数据结构都是_Collections_...

    详解如何选择使用ArrayList、HashTable、List、Dictionary数组

    最后,HybridDictionary结合了Hashtable和ListDictionary的优点,初始时使用ListDictionary,当数据量增大时切换到Hashtable,以平衡性能和内存使用。 在选择这些集合类时,开发者应考虑以下因素:数据类型、是否...

    HashTable、HashSet和Dictionary的区别点总结

    本文将从 HashTable、HashSet和Dictionary的定义、特点和使用场景等方面对其进行比较。 一、HashTable HashTable是.NET Framework中System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值...

    C#_集合类_Array,Arraylist,List,Hashtable,Dictionary,Stack,Queue_学习资料

    本文主要探讨了几个常用的集合类,包括Array、ArrayList、List、Hashtable、Dictionary, TValue&gt;、Stack和Queue,以及它们的特点和应用场景。 1. **数组**(Array):数组是最基本的数据结构,它是一个固定大小的...

    C# ArrayList、HashSet、HashTable、List、Dictionary的区别详解

    C# ArrayList、HashSet、HashTable、List、Dictionary的区别详解 C# 中有多种集合类,每种集合类都有其特点和应用场景。了解这些集合类的区别可以帮助开发者选择合适的集合类来提高程序的性能和可读性。本文将介绍 ...

    WinFormHashTable最简单用法,.net hashtable ,hashtable ,hashtable用法

    - **替代方案**:.NET Framework 2.0之后,推荐使用`Dictionary, TValue&gt;`类,它提供了更丰富的功能和更好的性能。 6. **示例代码** 下面是一个简单的WinForm应用中使用Hashtable的例子: ```csharp public ...

    C# json 转hashtable

    然而,随着.NET Framework的发展,`Dictionary, TValue&gt;`逐渐取代了`Hashtable`,因为后者不支持泛型,且不遵循.NET Framework的线程安全策略。 标题"**C# json 转 hashtable**"涉及到的主要知识点是将JSON字符串...

    dotnet C# 字典 Dictionary 和 Hashtable 的性能对比.rar

    在.NET框架中,`Dictionary, TValue&gt;`和`Hashtable`都是常见的哈希表实现,用于存储键值对数据。这两个类提供了快速访问数据的能力,但它们在设计、线程安全和性能方面存在一些差异。本篇文章将深入探讨`Dictionary`...

    Dictionary泛型的使用,带有例子

    泛型Dictionary使用详解 在编程中,泛型是非常重要的一个概念,它可以使得编程更加灵活和高效。在本文中,我们将详细介绍泛型Dictionary的使用,包括其结构、特点、操作方法等。 泛型Dictionary的结构 泛型...

    C# .net HashTable

    此外,`Hashtable`在.NET Framework 4.0及以后版本中已被弃用,推荐使用`Dictionary, TValue&gt;`。 10. **比较与选择** - `HashTable` vs `Dictionary, TValue&gt;`:`Dictionary`在.NET Framework 2.0引入,它提供了...

    hashmap与hashtable区别

    这是因为它内部的方法都是同步化的(synchronized),这就意味着在多线程环境中使用`Hashtable`时无需额外的同步处理。 - **HashMap**:默认情况下,`HashMap`是非线程安全的。如果需要在一个多线程环境中使用`...

    c#通讯录hashtable

    虽然现代C#编程更多推荐使用泛型的`Dictionary, TValue&gt;`,但在理解基础数据结构和旧代码维护时,对`Hashtable`的理解仍然至关重要。通过以上讨论,我们可以看到如何有效地利用`Hashtable`来实现一个简单的通讯录...

    c#重写HashTable

    在C#编程中,`HashTable`是一个非泛型集合类,它在.NET Framework早期版本中被广泛使用。然而,随着.NET Framework的不断发展,`HashTable`逐渐被更安全、类型安全且性能更高的`Dictionary, TValue&gt;`所取代。尽管...

    C#中哈希表(HashTable)用法实例详解(添加/移除/判断/遍历/排序等)

    或者,可以使用`SortedList`或`Dictionary, TValue&gt;`,它们提供有序的键值对存储。 总之,C#中的`HashTable`是一个强大且灵活的数据结构,适用于需要快速查找和管理键值对的场景。理解和熟练运用哈希表的特性,能极...

    Hashtable简述

    Hashtable是.NET Framework中System.Collections命名空间的一个类,它作为一个容器,专门用于存储键值对(key-...然而,在.NET 2.0及以后版本,更推荐使用`Dictionary, TValue&gt;`,因为它提供了更好的性能和更多的功能。

    HashTable 常用操作

    但是,如果应用程序只需要单线程访问,那么可以考虑使用`Dictionary, TValue&gt;`,后者在单线程环境下提供了更好的性能。 #### 五、总结 本文详细介绍了`.NET Framework`中的`Hashtable`类以及如何使用它来进行基本...

    hashtable序列化与反序列化

    `HashTable`继承自`Dictionary`类,并实现了`Serializable`接口,因此它支持序列化操作。 要序列化一个`HashTable`对象,我们需要执行以下步骤: 1. 确保`HashTable`类或包含它的类实现了`Serializable`接口。例如...

    C# Hashtable/Dictionary写入和读取对比详解

    在C#中,`HashTable`和`Dictionary, TValue&gt;`都是用于存储键值对的数据结构,但它们在实现和性能上有显著的区别。本文将详细解释这两个类的基本概念、内部工作原理,以及它们在插入和读取操作上的差异。 首先,`...

Global site tag (gtag.js) - Google Analytics