`
coollifer
  • 浏览: 54238 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

C#集合之HASHTABLE

    博客分类:
  • C#
阅读更多

 

1、HashTable定义

System.Collections. Hashtable类表示键/值对的集合,这些键/值对根据键的哈希代码进行组织, 每个元素都是一个存储在 DictionaryEntry 对象中的键/值对。键不能为 null,但值可以。

2.优点

1、通过Key快速查找。

2、Hashtable 是线程安全的。

3. Hashtable的构造器

构造器函数

注释

Public Hashtable ()

使用默认的初始容量(容量大小为0)、加载因子、哈希代码提供程序和比较器来初始化 Hashtable 类的新的空实例。

public Hashtable (IDictionary)

通过将指定字典中的元素复制到新的 Hashtable 对象中,初始化 Hashtable 类的一个新实例。新Hashtable 对象的初始容量等于复制的元素数,并且使用默认的加载因子、哈希代码提供程序和比较器。

public Hashtable (Int32)

使用指定的初始容量、默认加载因子、默认哈希代码提供程序和默认比较器来初始化 Hashtable 类的新的空实例。

4、Hashtable的属性

属性名

注释

Count

获取包含在 Hashtable 中的键/值对的数目。

IsFixedSize

获取一个值,该值指示 Hashtable 是否具有固定大小。

IsReadOnly

获取一个值,该值指示 Hashtable 是否为只读。

Keys

获取包含 Hashtable 中的键的 ICollection

Values

获取包含 Hashtable 中的值的 ICollection。

5. Hashtable的方法

方法名

注释

Void Add(object key,object value)

将带有指定键和值的元素添加到 Hashtable 中。

Void Clear()

从 Hashtable 中移除所有元素。

Bool Contains(object key)

确定 Hashtable 是否包含特定键。

Bool ContainsKey(object key)

确定 Hashtable 是否包含特定键。

Bool ContainsValue(object value)

确定 Hashtable 是否包含特定值。

Void Remove(object key)

从 Hashtable 中移除带有指定键的元素。

Void InsertRange(int index,Icollection collec)

用于从指定位置开始添加一批元素,列表后面的元素依次往后移动

Clone()

创建 Hashtable 的浅表副本。

GetObjectData()

实现 ISerializable 接口,并返回序列化 Hashtable 所需的数据。

 

6、Hashtable的使用示例

 

public class Program
{
        public static void Main(string[] args)
        {
            //创建一个HashTable
            Hashtable openWith = new Hashtable();

            //为HashTable添加元素,不能有重复的key,但可以有重复的值
            openWith.Add("txt", "notepad.exe");
            openWith.Add("bmp", "paint.exe");
            openWith.Add("dib", "paint.exe");
            openWith.Add("rtf", "wordpad.exe");

            

            //添加重复的key,会抛出异常
            try
            {
                openWith.Add("txt", "winword.exe");
            }
            catch
            {
                Console.WriteLine("An element with Key = \"txt\" already exists.");
            }

            //通过key获得值 
            Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);

            //重新赋值
            openWith["rtf"] = "winword.exe";
            Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);

            //以赋值的方式,创建一个新元素
            openWith["doc"] = "winword.exe";

            //如果HashTable中不包含该元素,将抛出异常(经测试这里不抛出异常)
            //原因(如果未找到指定的键,尝试获取它将返回 空引用(在 Visual Basic 中为 Nothing),尝试设置它将使用指定的键创建新元素。 )
            try
            {
                Console.WriteLine("For key = \"tif\", value = {0}.", openWith["tif"]);
            }
            catch
            {
                Console.WriteLine("Key = \"tif\" is not found.");
            }

            //判断是否包含特定的key
            if (!openWith.ContainsKey("ht"))
            {
                openWith.Add("ht", "hypertrm.exe");
                Console.WriteLine("Value added for key = \"ht\": {0}", openWith["ht"]);
            }

            //遍历HashTable
            Console.WriteLine();
            foreach (DictionaryEntry de in openWith)
            {
                Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
            }

            // 获取HashTable中值的集合
            ICollection valueColl = openWith.Values;


            Console.WriteLine();
            foreach (string s in valueColl)
            {
                Console.WriteLine("Value = {0}", s);
            }

            // 获取HashTable中键的集合
            ICollection keyColl = openWith.Keys;


            Console.WriteLine();
            foreach (string s in keyColl)
            {
                Console.WriteLine("Key = {0}", s);
            }


            Console.WriteLine("\nRemove(\"doc\")");
            //移除指定的元素
            openWith.Remove("doc");

            if (!openWith.ContainsKey("doc"))
            {
                Console.WriteLine("Key \"doc\" is not found.");
            }


            Hashtable mySourceHT = new Hashtable();
            mySourceHT.Add("A", "valueA");
            mySourceHT.Add("B", "valueB");

            // 创建一个字符串数组
            String[] myTargetArray = new String[15];
            myTargetArray[0] = "The";
            myTargetArray[1] = "quick";
            myTargetArray[2] = "brown";
            myTargetArray[3] = "fox";
            myTargetArray[4] = "jumped";
            myTargetArray[5] = "over";
            myTargetArray[6] = "the";
            myTargetArray[7] = "lazy";
            myTargetArray[8] = "dog";

            // 遍历数组的值
            Console.WriteLine("The target Array contains the following before:");
            PrintValues(myTargetArray, ' ');

            //将hashtable中的key复制到数组中
            Console.WriteLine("After copying the keys, starting at index 6:");
            mySourceHT.Keys.CopyTo(myTargetArray, 6);

            
            PrintValues(myTargetArray, ' ');

            //将hashtable中的Value复制到数组中
            Console.WriteLine("After copying the values, starting at index 6:");
            mySourceHT.Values.CopyTo(myTargetArray, 6);

            PrintValues(myTargetArray, ' ');

            Console.Read();
        }

        //遍历数据方法
        public static void PrintValues(String[] myArr, char mySeparator)
        {
            for (int i = 0; i < myArr.Length; i++)
                Console.Write("{0}{1}", mySeparator, myArr[i]);
            Console.WriteLine();
        }

    }
 

 

7、Hashtable遍历方法

方法一

 foreach (System.Collections.DictionaryEntry objDE in objHasTab)
{
    Console.WriteLine(objDE.Key.ToString());
    Console.WriteLine(objDE.Value.ToString());
}

 

方法二

System.Collections.IDictionaryEnumerator enumerator = objHashTablet.GetEnumerator(); 
while (enumerator.MoveNext())
{
    Console.WriteLine(enumerator.Key);         // Hashtable关健字
    Console.WriteLine

}

8、Hashtable排序

//把ht的键对象全部复制到ArrayList中

 ArrayList al = new ArrayList(ht.Keys);

 /*ht.Keys返回ht中所有键对象构成的集合,把该集合传递给ArrayList构造方法则得到一个包

*所有键对象的动态数组

*/

  al.Sort();//从小到大排列

  //排序完成输出

   for (int i = 0; i < al.Count;i++ )

   {

          object e=al[i];

          object temp = (object)ht[e];//键作为索引器来获得对应的值对象

           Console.WriteLine(temp.tostring());

}

分享到:
评论

相关推荐

    C#集合性能测试

    日常工作中我们用到各种集合,但对于他们的性能比较则不是太清楚,因为片处的数据量不大,所以性能优势无法体现,本测试程序可以直观的测试各种集合的性能ArrayList 、List 、Dictionary、Hashtable

    C# 集合的索引性能比较

    ArrayList,List,Hashtable,DataSet 的索引性能测试和对比

    C#中的集合示例(Array,ArrayList,Hashtable,List)

    C#中的集合示例(Array,ArrayList,Hashtable,List)

    C# 常用集合总结

    本文档对C#的几种常见的集合(BitArray, Dictionary, Hashtable, NameValueCollection, Queue, Stack)的用法作了归纳,每种集合都附有完整的测试代码。(另外一种常见集合ArrayList收录在另外一份文档:&lt;C# List使用...

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

    我们用的比较多的非泛型集合类主要有 ArrayList类 和 HashTable类。我们经常用HashTable 来存储将要写入到数据库或者返回的信息,在这之间要不断的进行类型的转化,增加了系统装箱和拆箱的负担,如果我们操纵的数据...

    浅析C#的复制和克隆

    //上面遍历的时候需要修改HashTable中的键值,一般会报异常,提示您的集合已修改XXX什么的,因为foreach遍历的时候,in 后面的集合不可更改 //这个时候应该我想到了,应该在便利之前复制一份, HashTable ht2 = new ...

    数组和集合对象(二) Hashtable练习

    请大家多多指教,有什么建议尽管提出来,谢谢大家

    C#6大集合类全面解析

    C#6大集合类:1.ArrayList类2.Stack类3.Queue类4.Hashtable类5.SortedList类6.NameValueCollection类。

    C#常见的几种集合 ArrayList,Hashtable,List&lt;T&gt;,Dictionary&lt;K,V&gt; 遍历方法对比

    本文对C#中常见集合ArrayList,Hashtable,List,Dictionary遍历方法做了简单的对比和介绍,有需要的朋友可以参考一下。

    c# 中的arrlist queue HashtableTest SortedList stack 集合

    c# 中的arrlist queue HashtableTest SortedList stack 集合

    序列化Hashtable

    想到SortedList这个东西很多方面跟Hashtable差不多,不过它还能依序取得集合中的元素,只是用的不是整数类型的Item属性,而是用GetByIndex()方法。所以就用它来偷梁换柱一下了。// [EnvironmentPermission...

    js 模拟实现类似c#下的hashtable的简单功能代码

    越来越感觉js对集合的处理没有c#强大。比如在实际开发中,经常用到在一维数组或者二维数组里取某一个满足某些条件的项,通常的处理方式就是遍历数组,对比条件,匹配就取出,然后结束循环。

    C#常见的几种集合 ArrayList,Hashtable,ListT,DictionaryK,V 遍历方法对比

    一、先来分别介绍一下ArrayList,Hashtable,...二、各种集合的遍历方法演示 1.ArrayList ArrayList list = new ArrayList(); //for遍历 for (int i = 0; i &lt; list.Count; i++) { SE se = (SE)list[i]; Console

    C#学习笔记_20100614

    在 C#中遍历和排序对象集合 StringWriter实现的一个功能 创建一个文本文件并写入文本 序列化对象到文件 创建一个文本文件并写入文本 文件夹拷贝 使用C#解析简单XML 读 XML文件 用 XmlWriter写 XML文件 插入数据到 ...

    C#中遍历各类数据集合的方法总结

    C#中遍历各类数据集合的方法,这里自己做下总结:枚举类型、遍历ArrayList(Queue、Stack)、Winform窗体中的控件、HashTable哈希表等等,具体祥看下

    Visual C#2010 从入门到精通(Visual.C#.2010.Step.By.Step).完整去密码锁定版 I部分

    10.2.4 hashtable集合类 189 10.2.5 sortedlist集合类 190 10.2.6 使用集合初始化器 191 10.2.7 比较数组和集合 192 10.2.8 使用集合类来玩牌 192 第10章快速参考 195 第11章 理解参数数组 197 11.1 使用数组...

    C#全能速查宝典

    《C#全能速查宝典》共分为8章,分别介绍了C#语言基础、Windows窗体及常用控件、Windows高级控件、控件公共属性、方法及事件、数据库开发、文件、数据流与注册表、GDI+绘图技术和C#高级编程,共包含562个C#编程中常用...

    C#检查指定对象是否存在于ArrayList集合中的方法

    本文实例讲述了C#检查指定对象是否存在于ArrayList集合中的方法。分享给大家供大家参考。具体分析如下: C#的ArrayList提供了一个专用的Contains方法来检测ArrayList是否包含指定的对象,返回值是一个bool类型 ...

    C#中datatable去重的方法

    主要介绍了C#中datatable去重的方法,通过两种不同的方法对比分析了datatable去重的技巧,非常具有实用价值,需要的朋友可以参考下

    c#学习方法

    5. 深入学习集合特性:索引器、自定义集合、深入刨析集合类型本质(ArrayList、HashTable)、学习泛型集合、泛型约束等。6. 学习委托与事件:委托与事件的区别、匿名方法、Lambda表达式。7. 正则表达式。8. 查询表达式...

Global site tag (gtag.js) - Google Analytics