- 浏览: 2173485 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (1878)
- [网站分类]ASP.NET (141)
- [网站分类]C# (80)
- [随笔分类]NET知识库 (80)
- [随笔分类]摘抄文字[非技术] (3)
- [随笔分类]养生保健 (4)
- [网站分类]读书区 (16)
- [随笔分类]赚钱 (7)
- [网站分类].NET新手区 (233)
- [随笔分类]网站 (75)
- [网站分类]企业信息化其他 (4)
- [网站分类]首页候选区 (34)
- [网站分类]转载区 (12)
- [网站分类]SQL Server (16)
- [网站分类]程序人生 (7)
- [网站分类]WinForm (2)
- [随笔分类]错误集 (12)
- [网站分类]JavaScript (3)
- [随笔分类]小说九鼎记 (69)
- [随笔分类]技术文章 (15)
- [网站分类]求职面试 (3)
- [网站分类]其他技术区 (6)
- [网站分类]非技术区 (10)
- [发布至博客园首页] (5)
- [网站分类]jQuery (6)
- [网站分类].NET精华区 (6)
- [网站分类]Html/Css (10)
- [随笔分类]加速及SEO (10)
- [网站分类]Google开发 (4)
- [随笔分类]旅游备注 (2)
- [网站分类]架构设计 (3)
- [网站分类]Linux (23)
- [随笔分类]重要注册 (3)
- [随笔分类]Linux+PHP (10)
- [网站分类]PHP (11)
- [网站分类]VS2010 (2)
- [网站分类]CLR (1)
- [网站分类]C++ (1)
- [网站分类]ASP.NET MVC (2)
- [网站分类]项目与团队管理 (1)
- [随笔分类]个人总结 (1)
- [随笔分类]问题集 (3)
- [网站分类]代码与软件发布 (1)
- [网站分类]Android开发 (1)
- [网站分类]MySQL (1)
- [网站分类]开源研究 (6)
- ddd (0)
- 好久没写blog了 (0)
- sqlserver (2)
最新评论
-
JamesLiuX:
博主,能组个队么,我是Freelancer新手。
Freelancer.com(原GAF – GetAFreelancer)帐户里的钱如何取出? -
yw10260609:
我认为在混淆前,最好把相关代码备份一下比较好,不然项目完成后, ...
DotFuscator 小记 -
日月葬花魂:
大哥 能 加我个QQ 交流一下嘛 ?51264722 我Q ...
web应用程序和Web网站区别 -
iaimg:
我想问下嵌入delphi写的程序总是出现窗体后面感觉有个主窗体 ...
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部 -
iaimg:
代码地址下不了啊!
C#自定义控件:WinForm将其它应用程序窗体嵌入自己内部
要了解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]);
}
}
}
}
发表评论
-
where T:new() 是什么意思
2014-04-18 09:26 1462where T:new() 是什么意思 经常看到方法后面 ... -
好久没写blog了
2012-05-21 18:43 2好久没写blog了 -
test
2011-03-19 09:48 818testddddddddddd -
QQ自动发日志分析
2011-03-10 18:15 1268首先列举比较重要的问 ... -
test
2011-02-23 18:03 807test -
test
2011-02-23 17:53 878test -
为啥cnblogs的数据不能导了
2011-02-23 11:03 913为啥cnblogs的数据不能导了内容 -
如何保护.net中的dll文件(防破解、反编译)
2010-07-30 00:28 1494.net是一种建立在虚拟机上执行的语言,它直接生成 MSIL ... -
提搞网站访问速度可做哪些优化
2010-08-08 15:30 1122一、 服务器优化 ... -
ASP.NET(c#)如何判断浏览器是否支持cookies
2010-07-29 09:33 1717实例代码: 下面是写cookie ... -
N点虚拟主机管理系统(For Windows2003/2008)功能及介绍
2010-04-09 11:23 2264N点虚拟主机管理系统是 ... -
使用c#+(datagrid控件)编辑xml文件
2010-04-06 09:13 1168对xml文件的记录进行删除,修改,或增加新记录。 利用了d ... -
HTTP代理模块(HTTP Proxy)
2010-04-04 10:19 3049HTTP代理模块(HTTP Proxy ... -
Error 80040154 retreiving COM Class factory
2010-03-29 09:23 22561.ask: Greetings, I have ... -
petshop4.0 详解之二(数据访问层之数据库访问设计)
2010-03-27 11:08 1071在系列一中,我从整体上分析了PetShop的架构设计,并提及了 ... -
分享十五个最佳jQuery幻灯插件和教程
2010-03-25 09:17 2010<p>在网站前端中使用jQuery库已经变得越来越 ... -
20个软件开发常用设计文档大全下载
2009-08-27 10:22 972搜集了一些软件开发的常用文档,分享给大家 总下载地址: h ... -
asp.net 在线 mp3,wma, avi
2009-09-04 13:58 9311.前台js<script type="tex ... -
sql db link string
2009-09-06 21:52 983SQL Server ODBC Standar ... -
ASP.Net2.0小技巧 保持滚动条的位置 焦点移动到某个控件 $符号轻松的使用FindControl
2009-09-11 11:05 1300您可能不知道的ASP.Net2.0 ...
相关推荐
在编程领域,哈希表(Hashtable)和字典(Dictionary)是两种常用的数据结构,它们在存储和检索键值对时提供了高效的性能。本文将深入探讨这两种数据结构的原理、性能差异以及实际应用中的考虑因素。 哈希表,通常...
`Hashtable`是`Dictionary`类的一个子类,它不支持`null`键或`null`值。这个类实现了`Map`接口,允许我们通过键来存储和检索对象。本文将详细介绍`Hashtable`的基本用法,包括插入元素、查找元素、遍历以及其相关...
C#数据结构之Array、ArrayList、Hashtable、Dictionary C#中有多种数据结构可以用来存储和管理数据,今天我们将讨论四种常用的数据结构:Array、ArrayList、Hashtable和Dictionary。这些数据结构都是_Collections_...
最后,HybridDictionary结合了Hashtable和ListDictionary的优点,初始时使用ListDictionary,当数据量增大时切换到Hashtable,以平衡性能和内存使用。 在选择这些集合类时,开发者应考虑以下因素:数据类型、是否...
本文将从 HashTable、HashSet和Dictionary的定义、特点和使用场景等方面对其进行比较。 一、HashTable HashTable是.NET Framework中System.Collections命名空间提供的一个容器,用于处理和表现类似key-value的键值...
本文主要探讨了几个常用的集合类,包括Array、ArrayList、List、Hashtable、Dictionary, TValue>、Stack和Queue,以及它们的特点和应用场景。 1. **数组**(Array):数组是最基本的数据结构,它是一个固定大小的...
C# ArrayList、HashSet、HashTable、List、Dictionary的区别详解 C# 中有多种集合类,每种集合类都有其特点和应用场景。了解这些集合类的区别可以帮助开发者选择合适的集合类来提高程序的性能和可读性。本文将介绍 ...
- **替代方案**:.NET Framework 2.0之后,推荐使用`Dictionary, TValue>`类,它提供了更丰富的功能和更好的性能。 6. **示例代码** 下面是一个简单的WinForm应用中使用Hashtable的例子: ```csharp public ...
然而,随着.NET Framework的发展,`Dictionary, TValue>`逐渐取代了`Hashtable`,因为后者不支持泛型,且不遵循.NET Framework的线程安全策略。 标题"**C# json 转 hashtable**"涉及到的主要知识点是将JSON字符串...
在.NET框架中,`Dictionary, TValue>`和`Hashtable`都是常见的哈希表实现,用于存储键值对数据。这两个类提供了快速访问数据的能力,但它们在设计、线程安全和性能方面存在一些差异。本篇文章将深入探讨`Dictionary`...
泛型Dictionary使用详解 在编程中,泛型是非常重要的一个概念,它可以使得编程更加灵活和高效。在本文中,我们将详细介绍泛型Dictionary的使用,包括其结构、特点、操作方法等。 泛型Dictionary的结构 泛型...
此外,`Hashtable`在.NET Framework 4.0及以后版本中已被弃用,推荐使用`Dictionary, TValue>`。 10. **比较与选择** - `HashTable` vs `Dictionary, TValue>`:`Dictionary`在.NET Framework 2.0引入,它提供了...
这是因为它内部的方法都是同步化的(synchronized),这就意味着在多线程环境中使用`Hashtable`时无需额外的同步处理。 - **HashMap**:默认情况下,`HashMap`是非线程安全的。如果需要在一个多线程环境中使用`...
虽然现代C#编程更多推荐使用泛型的`Dictionary, TValue>`,但在理解基础数据结构和旧代码维护时,对`Hashtable`的理解仍然至关重要。通过以上讨论,我们可以看到如何有效地利用`Hashtable`来实现一个简单的通讯录...
在C#编程中,`HashTable`是一个非泛型集合类,它在.NET Framework早期版本中被广泛使用。然而,随着.NET Framework的不断发展,`HashTable`逐渐被更安全、类型安全且性能更高的`Dictionary, TValue>`所取代。尽管...
或者,可以使用`SortedList`或`Dictionary, TValue>`,它们提供有序的键值对存储。 总之,C#中的`HashTable`是一个强大且灵活的数据结构,适用于需要快速查找和管理键值对的场景。理解和熟练运用哈希表的特性,能极...
Hashtable是.NET Framework中System.Collections命名空间的一个类,它作为一个容器,专门用于存储键值对(key-...然而,在.NET 2.0及以后版本,更推荐使用`Dictionary, TValue>`,因为它提供了更好的性能和更多的功能。
但是,如果应用程序只需要单线程访问,那么可以考虑使用`Dictionary, TValue>`,后者在单线程环境下提供了更好的性能。 #### 五、总结 本文详细介绍了`.NET Framework`中的`Hashtable`类以及如何使用它来进行基本...
`HashTable`继承自`Dictionary`类,并实现了`Serializable`接口,因此它支持序列化操作。 要序列化一个`HashTable`对象,我们需要执行以下步骤: 1. 确保`HashTable`类或包含它的类实现了`Serializable`接口。例如...
在C#中,`HashTable`和`Dictionary, TValue>`都是用于存储键值对的数据结构,但它们在实现和性能上有显著的区别。本文将详细解释这两个类的基本概念、内部工作原理,以及它们在插入和读取操作上的差异。 首先,`...