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

一、哈希表(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(); //按字母顺序进行排序
 foreach(string skey in akeys)
 {
   Console.Write(skey + ":");
   Console.WriteLine(ht[skey]);//排序后输出
 }

五、简单应用

实现电子商务中的购物车,试衣间,一张物品多张图片等功能,我正在用!
先前我们的购物车使用的是数据库方式实现,每次购物都要进行数据库操作,很影响效率。现在我们采用HashTable和Session来实现购物车,这样便节省了数据库的操作,大大的提高效率 

1 private void DataGrid1_ItemCommand(object source, System.Web.UI.WebControls.DataGridCommandEventArgs e)//假设前面购买命令是一个命令名为buy的LinkButton
   2 {//关键,建立和加如购物车
   3 string pid=this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString();//取出编号
   4 if(e.CommandName=="buy")//如果命令名是 buy,说明是购买
   5 {
   6 if(Session["bus"]==null)//先就得检查购物车是否存在,如果不存在,就建立 
   7 {
   8 System.Collections.Hashtable ht=new Hashtable();//先建立一个哈希表
   9 ht.Add(pid,1);//哈希表中的两个列,一个key,一个value ,key放编号,value放购买数量好了,预设置为1
  10 Session["bus"]=ht;//将哈希表赋值给Session对象
  11 }
  12 else//如果存在的话
  13 {
  14 Hashtable ht=(Hashtable)Session["bus"];//使用强制类型转换,再将Session["bus"]赋值给哈希表对象 ht
  15 if(ht[pid]==null)//如果哈希表中对应的ID没有,
  16 {
  17 ht[pid]=1;//那就直接给他设为 1
  18 }
  19 else//如果已经有对应的ID
  20 {
  21 ht[pid]=(int)ht[pid]+1;//那么就把原来的取出来再加上 1
  22 }
  23 Session["bus"]=ht;//最后再更新Session 对象
  24 }
  25 }
  26
  27 }
  
  而读取的方法如下:    
   
  this.DataList1.DataSource=(Hashtable)Session["bus"]; 
   this.DataList1.DataBind();


   1private void LinkButton1_Click(object sender, System.EventArgs e)
   2 {
   3
   4 foreach(DataListItem dl in this.DataList1.Items)//遍历集合
   5 {
   6 TextBox tb=(TextBox)dl.FindControl("TextBox1");//找到文本框
   7 int newpid=Convert.ToInt32(tb.Text.ToString());//查出文本框里面的值
   8
   9 Label label1=(Label)dl.FindControl("key");//找到装载哈希表key字段的那个控件
  10 string pid=label1.Text.ToString();//把他的值拿出来
  11
  12 Hashtable ht=(Hashtable)Session["bus"];//把session["bus"]对象赋值给哈希表 ht
  13 int oldpid=(int)ht[pid];//求得原来的数量
  14
  15 if(newpid!=oldpid)//如果文本框里的值不等于原来的数量,就用新的更换到哈希表中的值
  16 {
  17 ht[pid]=newpid;
  18 }
  19 Session["bus"]=ht;//最后再更新Session 对象
  20 }
  21 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549915.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IArea

用于获取一个几何对象的面积 IArea接口的第一个属性Area(只读,返回一个double类型的数值,为此Area的面积)IArea接口的第二个属性Centroid(只读,返回一个IPoint类型的变量,为此Area的重心&#x…

Dojo学习笔记(8. dojo.event dojo.event.topic dojo.event.browser)

Dojo学习笔记(8. dojo.event & dojo.event.topic & dojo.event.browser) 模块:dojo.event 终于进入有名的dojo事件处理系统的学习了,学习前建议读者先去补习一下AOP的相关知识 dojo.event.connect 绑定指定的方法到指定的对象的方法上 Usage Exa…

程序员应该读的书

第1名:1306票《Code Complete (2nd Ed) by Steve McConnell》中文版《代码大全(第二版)》 第2名:1161票 《The Pragmatic Programmer》,中文版《程序员修炼之道》 第3名:689票 《Structure and Interpretat…

linux系统启动自动启动,linux系统下的自动启动

原理:Linux开机启动的时候会执行目录/etc/init.d目录下的文件,就是系统配置的服务,所以就要把weblogic配置为系统的一个服务,开机时启动。具体步骤:1、创建weblogic文件。在目录/etc/init.d/weblogic命令是&#xff1a…

古墓:黑夜中不断的断龙石敲击声

古墓:黑夜中不断的断龙石敲击声 大概在2000年发于原水木清华BBS,当时二十左右,看武侠,看哲学,看维特根斯坦。这个主要写心中的疑惑。1 唐诗一首—— 纱窗日落渐黄昏 金屋无人见泪痕 寂寞空庭春欲晚 梨花满…

计算三角形的面积

计算三角形的面积 简介:今天比较郁闷,计算平均曲率流使图形光顺的时候,没有成功。(.) 向量求面积 百度百科链接中的9根据向量求面积 double vfarea(MyMesh& mesh, MyMesh::VertexHandle vh) {typedef typename MyM…

linux coreutils升级,Coreutils

Coreutils提供了配置工具,定义颜色代码更加方便;Coreutils包含的不仅仅是ls,同时作为Linux用户,我更习惯于使用GNU的各种shell工具。其实就是安装了Coreutils,就可以使用Linux下的程序,【ls/mkdir/mv】等等…

IDEA插件:search with bing、search with baidu

//转载请注明出处:https://www.cnblogs.com/nreg/p/11267169.html 当项目出现错误时,经常需要复制错误信息粘贴到浏览器查询,但是手动复制再粘贴太麻烦了, 因此IDEA官方给了右键菜单search with google, 感觉上方便了许多&#xf…

linux2.6 gcc 4.8.2,在Red Hat Enterprise linux 6.5上安装GCC 4.8.2

我是Red Hat Enterprise linux的新手.我在Red Hat Enterprise Linux 6.5上编译gcc 4.8.2时面临问题;我从GNU webite中获取源代码.我按照这个链接中的步骤http://gcc.gnu.org/wiki/InstallingGCC发出的命令是:tar xzf gcc-4.6.2.tar.gzcd gcc-4.6.2./contrib/download_prerequis…

oracle 游标(学校)

这段时间实在是很忙,结婚、赶项目进度、被迫出书、教学。每件事都是不能得罪的。。。。前几天帮教务处修正oracle数据库数据问题,把代码贴出来防止以后找不到了 declareCURSORcurTTT isselectXN,XM,XQ,KCMC,XF,BJMC fromCJB;XN1 VARCHAR2(10);XM1 VARCHA…

残差

残差 残差在数理统计中是指实际观察值与估计值(拟合值)之间的差。 参考链接 百度百科 转载于:https://www.cnblogs.com/eat-too-much/p/11267651.html

linux arm ffmpeg configure文件,ffmpeg库的交叉编译记录

系统信息:UbuntuRelease 10.04主机编译器版本:liweiliwei:~$gcc -vUsingbuilt-in specs.Target:i486-linux-gnu… … … …gccversion 4.4.3 (Ubuntu 4.4.3-4ubuntu5)交叉编译器版本:liweiliwei:~$arm-linux-gcc -vUsingbuilt-in specs.Targe…

[原创]公布读取瑞星注册码的小程序源代码

大概一年多了,瑞星一直都没更改其序列号保存方式。这还是偶在学校时无聊研究的。偶是菜鸟,就不多说了。 关键代码如下: 1stringrisingpath;2inti, j 0; longsnoffset, idoffset;34//以下读取5//HKEY_LOCAL_MACHINE\SOFTWARE\rising\Rav,并存在…

红帽linux5.5序列号,Redhat 5 安装序列号及版本说明

在不久前发布的开源虚拟化战略和路线图中,红帽宣称将在未来的3至18个月内,提供四种虚拟化技术和产品,包括:红帽企业Linux、红帽企业虚拟化 Hypervisor、红帽企业服务器虚拟化管理、红帽企业桌面虚拟化管理.今天,他们公布了最新版Red Hat Enterprise Linux, RHEL 5.4.它支持广泛…

Linux常用备份恢复工具

[url]http://os.51cto.com/art/200611/34464.htm[/url]转载于:https://blog.51cto.com/cicizz/9272

Selenium 2自动化测试实战4(引用模块)

一、模组1.模组也叫类库或模块,引用模块 在python中,通过import….或from….import….的方式引用模块,下面引用time模块 import time print (time.ctime())#输出结果为“Tue Jul 30 11:34:32 2019”在time模块下面有一个ctime()方法用于获得当…

linux每隔多久调度y,Linux 进程调度+Linux系统一般执行过程 笔记

进程的调度时机与进程的切换操作系统原理中介绍了大量进程调度算法,这些算法从实现的角度看仅仅是从运行队列中选择一个新进程,选择的过程中运用了不同的策略而已。对于理解操作系统的工作机制,反而是进程的调度时机与进程的切换机制更为关键…

知识关联的价值还无法与人的关联的价值相比

在google的可怕之处一文中得到weidagang2046的指点,顿时惊出一身冷汗。 只研究计算机如何理解人是不够的,实际上,在人和计算机共存的系统中,有四方面的关系要研究: 人->机,机->…

稍微写一个ajax json解析的东西。如果前后端分离。

要形成前后端彻底分离&#xff0c;还是需要ajax 相互传递json&#xff0c;来保持数据的交互。所以写一个ajax 解析来来做记录。 <script>     //只要刷新页面就会直接获取到需要的json$(document).ready(function() {$.ajax({url:"/helloBody",type:"…

appsan可以扫描linux吗,[经验]使用appscan实现多站扫描简单自动化

随着年龄增长&#xff0c;身上负担的压力也越来越大。在工作中很多时候都会需要短时间内扫描多个网站&#xff0c;可能是平时时间不够&#xff0c;或者是客户特别要求&#xff0c;很多时候工作中的扫描工作要放在晚上睡觉时间来做。但是白天忙了一天&#xff0c;晚上不可能一直…