李国帅 2007.5

令我没有想到的是可以直接枚举,我竟然在hashtable类成员中找不到如何根据键得到值。从网上也找不到,忽然看到可以枚举,联想到枚举的用法,原来可以直接使用myHT[nCurrentIndex]来设置和读取hash值,帮助中有hashtable的values属性但是不能调用,原来是用枚举器调用。




private Hashtable myHT;
private void Page_Load(object sender, System.EventArgs e)
{
...
myHT = new Hashtable();
}
private void Page_Unload(object sender, System.EventArgs e)
{
myHT.Clear();
}
private void InitializeComponent()
{
...
this.Load += new System.EventHandler(this.Page_Load);
this.Unload += new System.EventHandler(this.Page_Unload);
}
private void GridWareList_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)
{
int nCurrentIndex = e.Item.ItemIndex;
switch(e.CommandName)
{
case "Plus":
if (myHT.Contains((int)nCurrentIndex))//因为默认情况下null==0,但是键值不能是null
{
myHT.Add(nCurrentIndex, int.Parse(((LinkButton)(e.Item.Cells[2].Controls[0])).Text));
}
else
{
myHT[nCurrentIndex] = (int)myHT[nCurrentIndex] + 1;
((LinkButton)(e.Item.Cells[2].Controls[0])).Text = myHT[nCurrentIndex].ToString();
}
break;
case "minus":
if (myHT.Contains((int)nCurrentIndex))
{
myHT.Add(nCurrentIndex, int.Parse(((LinkButton)(e.Item.Cells[2].Controls[0])).Text));
}
else
{
if ((int)myHT[nCurrentIndex] > 0)
{
myHT[nCurrentIndex] = (int)myHT[nCurrentIndex] - 1;
((LinkButton)(e.Item.Cells[2].Controls[0])).Text = myHT[nCurrentIndex].ToString();
}
}
break;
...
}
}


在C#中应用哈希表(Hashtable)

转载网文2007

一.哈希表(Hashtable)简述

在.NET Framework中,Hashtable是System.Collections命名空间提供的一个容器,用于处理和表现类似key/value的键值对,其中key通常可用来快速查找,同时key是区分大小写;value用于存储对应于key的值。Hashtable中key/value键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对.

二.哈希表的简单操作

在哈希表中添加一个key/value键值对:HashtableObject.Add(key,value);

在哈希表中去除某个key/value键值对:HashtableObject.Remove(key);

从哈希表中移除所有元素: HashtableObject.Clear();

判断哈希表是否包含特定键key: HashtableObject.Contains(key);

下面控制台程序将包含以上所有操作:

using System;
using System.Collections; //使用Hashtable时,必须引入这个命名空间
class hashtable
{
public static void Main()
{
Hashtable ht=new Hashtable(); //创建一个Hashtable实例
ht.Add("E","e");//添加key/value键值对
ht.Add("A","a");
ht.Add("C","c");
ht.Add("B","b");
string s=(string)ht["A"];
if(ht.Contains("E")) //判断哈希表是否包含特定键,其返回值为true或false
Console.WriteLine("the E key:exist");
ht.Remove("C");//移除一个key/value键值对
Console.WriteLine(ht["A"]);//此处输出a
ht.Clear();//移除所有元素
Console.WriteLine(ht["A"]); //此处将不会有任何输出
}
}

三,遍历哈希表

遍历哈希表需要用到DictionaryEntry Object,代码如下:

for(DictionaryEntry de in ht) //ht为一个Hashtable实例
{
Console.WriteLine(de.Key);//de.Key对应于key/value键值对key
Console.WriteLine(de.Value);//de.Key对应于key/value键值对value

四,对哈希表进行排序

对哈希表进行排序在这里的定义是对key/value键值对中的key按一定规则重新排列,但是实际上这个定义是不能实现的,因为我们无法直接在Hashtable进行对key进行重新排列,如果需要Hashtable提供某种规则的输出,可以采用一种变通的做法:

ArrayList akeys=new ArrayList(ht.Keys); //别忘了导入System.Collections
akeys.Sort(); //按字母顺序进行排序
for(string skey in akeys)
{
Console.Write(skey + ":");
Console.WriteLine(ht[skey]);//排序后输出