一,哈希表(Hashtable)简述
在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似keyvalue的键值对,其中key通常可用来快速查找,但排序速度很慢。同时key是区分大小写;value用于存储对应于key的值。Hashtable中keyvalue键值对均为object类型,所以Hashtable可以支持任何类型的keyvalue键值对.
二,c#中Hashtable用法简述
1.使用hashtable前.需要添加System.Collections的引用
using System.Collections;
2.添加元素
Hashtable.Add(key,value);// key,value可以是任何类型
如果key有重复会掷出运行时异常,你可以这样处理
if(Hashtable.Contains(key)==false){
Hashtable.Add(key,value);// 不存在则添加
}
也可以这样处理,效率要高些
try{
Hashtable.Add(key,value);
}
catch{
// 不处理重复异常
}
3.删除元素
Hashtable.Remove(key);
4.删除所有
Hashtable.Clear();
5.判断键是否已经存在
Hashtable.Contains(key) // 这个刚才已经用过了
6.遍历键
foreach(Object key in Hashtable.Keys){
}
7.遍历值
foreach(Object value in Hashtable.Values){
}
8.同时遍历键值对
foreach(DictionaryEntry de in ht)
{
Console.WriteLine(de.Key);// 取得键
Console.WriteLine(de.Value);// 取得值
}
9.排序键输出(对值也是一样处理)
ArrayList arraylist = new ArrayList(Hashtable.Keys);
arraylist.Sort();
三,示例代码
using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
namespace HashtableHelper//命名空间名不可使用类名,如:namespace Hashtable
{
class HashtableHelper
{
private Hashtable list;
private Hashtable _list
{
set { list = value; }
get { return list; }
}
public HashtableHelper()
{
list = new Hashtable();
Console.WriteLine("-----------Hashtable-------------");
}
//添加一个键值对
public void Add(object key, object value)
{
Console.WriteLine("向Hashtable中添加键/值对");
list.Add(key, value);
Console.WriteLine("加入/t键:{0}/t值:{1}", key, value);
}
//移除一个键值对
public void Remove(object key)
{
Console.WriteLine("从Hashtable中移除键/值对");
list.Remove(key);
Console.WriteLine("删除/t键:{0}", key);
}
//根据键得到一个键值对
public void GetValue(object key)
{
Console.WriteLine("根据键得到一个键值对");
Console.WriteLine(string.Format("取值/t键{0}的值:{1}", key, list[key]));
}
//判断Hashtable中是否含有某一特定键
public void Contains(object i)
{
Console.WriteLine("判断Hashtable中是否含有某一特定键");
if (list.Contains(i))
Console.WriteLine("Hashtable中含有键:{0}",i);
else
Console.WriteLine("Hashtable中不含有键:{0}", i);
}
//遍历键
public void GetKeys()
{
Console.WriteLine("遍历Hashtable键");
foreach(object de in list.Keys)
{
Console.WriteLine("/t键:{0}",de);
}
}
//遍历值
public void GetValues()
{
Console.WriteLine("遍历Hashtable值");
foreach(object de in list.Values)
{
Console.WriteLine("/t值:{0}",de);
}
}
//使用foreach遍历,每一个键/值对是DictionaryEntry类型,注意:逆序遍历
public void GetKeyValues()
{
Console.WriteLine("遍历键/值对");
foreach (DictionaryEntry de in list)//Dictionary与DictionaryEntry区别
{
Console.WriteLine("/t键:{0}/t值:{1}", de.Key, de.Value);//C#严格区分大小写,如de.key,de.value为错误
}
}
//对Hashtable键排序
public void Sort()
{
Console.WriteLine("对Hashtable键进行排序");
ArrayList hlist = new ArrayList(list.Keys);
hlist.Sort();
for (int i = 0; i < hlist.Count;i++ )
{
Console.WriteLine("/t键:{0}",hlist[i]);
}
}
//清空Hashtable
public void Clear()
{
Console.WriteLine("清空Hashtable");
list.Clear();
Console.WriteLine("清空了Hashtable!");
}
//获取Hashtable信息
public void GetInfo()
{
Console.WriteLine("获取Hashtable信息");
Console.WriteLine(string.Format("信息/t元素总数:{0}", list.Count));
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace HashtableHelper
{
class Program
{
static void Main(string[] args)
{
HashtableHelper htb = new HashtableHelper();
htb.Add(0,"唐玉芳");
htb.Add(1,"唐玉芳");
htb.Add(2,"唐玉芳");
htb.Add(3,"唐玉芳");
htb.Add(4,"唐玉芳");
htb.Add(5,"唐玉芳");
htb.Add(6,"唐玉芳");
htb.Add(7,"唐玉芳");
htb.Add(8,"唐玉芳");
htb.Add(9,"唐玉芳");
htb.Add(10,"唐玉芳");
htb.Add(11,"唐玉芳");
//htb.Add(0,"唐玉芳");
htb.GetValue(1);
htb.GetValue(0);
htb.GetKeys();
htb.GetValues();
Console.WriteLine("对Hashtable键排序开始");
htb.Sort();
Console.WriteLine("对Hashtable键排序结束");
htb.GetValues();
htb.GetKeyValues();
htb.Contains(111);
htb.GetInfo();
htb.Remove(0);
htb.Remove(0);
htb.GetValues();
htb.GetInfo();
htb.Clear();
htb.GetInfo();
}
}
}
注意:对哈希表进行排序在这里的定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用上述变通的做法。