C# Hashtable 与 Dictionary的不同

C# Hashtable 与 Dictionary的不同

Hashtable 与 Dictionary 区别
1.Hashtable添加的元素是object类型,而Dictionary添加的是指定(T)类型。
2.Dictionary有泛型的优势,读取速度较快,容量利用更加充分。
3.在foreach循环中,Dictionary可以取到子对象,而Hashtable不可以。

哈希表 Hashtable

使用Hashtable需要引入命名空间System.Collections。Hashtable中key/value的键值对均为object类型,所以Hashtable可以支持任何类型的key/value键值对,Hashtable中每个对象是一个存储在DictionaryEntry对象中的键值对。

常用属性

属性 描述
Count 获取Hashtable中包含的键值对个数
Keys 获取Hashtable中所有键的集合
Values 获取Hashtable中所有值的集合

常用方法

方法 描述
public virtual void Add(object key, object value); 向Hashtable添加一个带有指定的键和值的元素
public virtual bool ContainsKey(object key); 判断Hashtable是否包含指定的键
public virtual bool ContainsValue(object value); 判断Hashtable是否包含指定的值
public virtual void Remove(object key); 从Hashtable中移除指定的键的元素
public virtual void Clear(); 从Hashtable中移除所有的元素

注意:由于IDictionary接口是键/值对的非泛型集合的基接口,而每个元素都是键/值对,并存储在DictionaryEntry对象中,因此元素类型既不是键的类型,也不是值的类型,而是DictionaryEntry类型。(留个坑,自己也没搞明白是啥)

Hashtable ht = new Hashtable();

ht.Add(1, true);
ht.Add(2, "FALSE");

Console.WriteLine("当前包含键值对个数:{0}", ht.Count);//输出:2

Console.WriteLine("---- 通过键求键值对 ----");
foreach (var key in ht.Keys)
{
    
    
    Console.WriteLine("{0} - {1}", key, ht[key]);//输出:2-"FALSE" 1-True 
}

Console.WriteLine("---- 添加后值的集合 ----");
foreach (var value in ht.Values)
{
    
    
    Console.WriteLine("{0}", value);//输出:FALSE True
}

if (ht.ContainsKey(1))
{
    
    
    Console.WriteLine("Hashtable中包含键 1 .");//输出
}

if(ht.ContainsValue(true))
{
    
    
    Console.WriteLine("Hashtable中包含值 true .");//输出
}

ht.Remove(1);
Console.WriteLine("---- 移除键 1 之后 ----");
foreach(DictionaryEntry de in ht)
{
    
    
    Console.WriteLine("{0} - {1}", de.Key, de.Value);//输出:2 - FALSE
}


ht.Clear();
Console.WriteLine("---- 移除全部之后 ----");
foreach (DictionaryEntry de in ht)
{
    
    
    Console.WriteLine("{0} ------- {1}", de.Key, de.Value);//无输出
}

Console.ReadKey();

字典 Dictionary

Dictionary<TKey, TValue>包含在System.Collections.Generic命名空间中。Dictionary<TKey, TValue>可以支持指定的任何类型的key/value键值对。所以Dictionary<TKey, TValue>对象只能添加指定类型的key/value键值对。Dictionary<TKey, TValue>中每个对象是一个存储在KeyValuePair<TKey, TValue>对象中的键值对。

常用属性

属性 描述
Count 获取Dictionary<TKey, TValue>中包含的键值对个数
Item 获取Dictionary<TKey, TValue>中的某个键值对
Keys 获取Dictionary<TKey, TValue>中所有键的集合
Values 获取Dictionary<TKey, TValue>中所有值的集合

常用方法

方法 描述
public void Add(TKey key, TValue value); 将指定的键和值添加到字典中
public bool ContainsKey(TKey key); 判断Dictionary<TKey, TValue>是否包含指定的键
public bool ContainsValue(TValue value); 判断Dictionary<TKey, TValue>是否包含指定的值
public bool Remove(TKey key); 从Dictionary<TKey, TValue>中移除指定的键的元素
public void Clear(); 从Dictionary<TKey, TValue>中移除所有的键值对
Dictionary<int, string> dc = new Dictionary<int, string>();

dc.Add(21002121, "张三");
dc.Add(21002122, "李四");

Console.WriteLine("字典中的键值对个数:{0}", dc.Count);//输出:2

Console.WriteLine("---- 添加之后键值对 ----");
foreach (var item in dc)
{
    
    
    Console.WriteLine("{0} - {1}", item.Key, item.Value);//输出:21002121 - 张三   21002122 - 李四
}

Console.WriteLine("---- 通过键求键值对 ----");
foreach (var key in dc.Keys)
{
    
    
    Console.WriteLine("{0} - {1}", key, dc[key]);//输出:21002121 - 张三   21002122 - 李四
}

Console.WriteLine("---- 添加后值的集合 ----");
foreach (var value in dc.Values)
{
    
    
    Console.WriteLine("{0}", value);//张三 李四
}

if(dc.ContainsKey(21002121))
{
    
    
    Console.WriteLine("Dictionary中包含键 21002121 .");//输出
}

if(dc.ContainsValue("李四"))
{
    
    
    Console.WriteLine("Dictionary中包含值 李四 .");//输出
}

dc.Remove(21002121);

Console.WriteLine("---- 移除键 21002121 之后 ----");
foreach (KeyValuePair<int, string> kp in dc)
{
    
    
    Console.WriteLine("{0} - {1}", kp.Key, kp.Value);//输出:21002122 - 李四
}

dc.Clear();
Console.WriteLine("---- 移除全部之后 ----");
foreach (KeyValuePair<int, string> kp in dc)
{
    
    
    Console.WriteLine("{0} ----- {1}", kp.Key, kp.Value);//无输出
}


Console.ReadKey();

Hashtable 与 Dictionary 插入方法的时间比较

Dictionary<int, int> dc = new Dictionary<int, int>();
Hashtable ht = new Hashtable();

int count = 10000000;//插入的次数 1千万
Stopwatch sw = new Stopwatch();
sw.Start();//计时
for(int i = 0; i < count; i++)
{
    
    
    dc.Add(i, i);
}
sw.Stop();
Console.WriteLine("字典Dictionary<TKey, TValue>耗时(毫秒):" + sw.ElapsedMilliseconds);//输出:388

sw.Restart();
for (int i = 0; i < count; i++)
{
    
    
    ht.Add(i, i);
}
sw.Stop();
Console.WriteLine("哈希表Hashtable耗时(毫秒):" + sw.ElapsedMilliseconds);//输出:2497
Console.ReadLine();

注意:所消耗的时间并不是唯一的,性能一般的电脑建议减低插入次数

因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。

猜你喜欢

转载自blog.csdn.net/qq_46051312/article/details/123632469