C# 基础 Dictionary(字典)和ConcurrentDictionary(线程安全的字典)

一、Dictionary
Dictionary 泛型类提供了键值对的映射。通过键来检索值的速度是非常快的,接近于 O(1),这是因为 Dictionary 类是作为一个哈希表来实现的。检索速度取决于为 TKey 指定的类型的哈希算法的质量。TValue可以是值类型,数组,类或其他。

Dictionary是一种变种的HashTable,它采用一种分离链接散列表的数据结构来解决哈希冲突的问题。命名空间System.Collection.Generic

Dictionary属性和方法
1、Dictionary一些常用的属性

属性 描述
Comparer 获取用于确定字典中的键是否相等的 IEqualityComparer
Count 获取包含在 Dictionary 中的键/值对的数目
Item 获取或设置与指定的键相关联的值
Keys 获取包含 Dictionary 中的键的集合
Values 获取包含 Dictionary 中的值的集合

2、Dictionary一些常用的方法

方法 描述
Add 将指定的键和值添加到字典中
Clear 从 Dictionary 中移除所有的键和值
ContainsKey 确定 Dictionary 是否包含指定的键
ContainsValue 确定 Dictionary 是否包含特定值
Equals(Object) 确定指定的 Object 是否等于当前的 Object
Finalize 允许对象在“垃圾回收”回收之前尝试释放资源并执行其他清理操作
GetEnumerator 返回循环访问 Dictionary 的枚举器
GetHashCode 用作特定类型的哈希函数
GetObjectData 实现 System.Runtime.Serialization.ISerializable 接口,并返回序列化 Dictionary 实例所需的数据
GetType 获取当前实例的 Type
MemberwiseClone 创建当前 Object 的浅表副本
OnDeserialization 实现 System.Runtime.Serialization.ISerializable 接口,并在完成反序列化之后引发反序列化事件
Remove 从 Dictionary 中移除所指定的键的值
ToString 返回表示当前对象的字符串
TryGetValue 获取与指定的键相关联的值

实例

using System;
using System.Collections;
using System.Collections.Generic;

namespace WebApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, string> myDic = new Dictionary<string, string>();
            
            //插入
            myDic.Add("1", "Dictionary.net");
            myDic.Add("2", "Dictionary.net2");
            myDic.Add("3", "Dictionary.net3");

            //key 存在
            try
            {
                myDic.Add("1", "DictionaryNew.net");
            }
            catch
            {
                Console.WriteLine("Key = \"1\" already exists.");
            }
            //取值
            Console.WriteLine("key = \"2\", value = {0}.", myDic["2"]);

            //修改
            myDic["2"] = "DictionaryNew.net2";
            myDic["4"] = "Dictionary.net4";   //修改的key不存在则新增
            Console.WriteLine("key = \"2\", value = {0}.", myDic["2"]);
            Console.WriteLine("key = \"4\", value = {0}.", myDic["4"]);

            //判断key是否存在
            if (!myDic.ContainsKey("5"))
            {
                myDic.Add("5", "Dictionary.net5");
                Console.WriteLine("key = \"5\": {0}", myDic["5"]);
            }
             //移除
            myDic.Remove("1");

            if (!myDic.ContainsKey("1"))
            {
                Console.WriteLine("Key \"1\" is not found.");
            }
            //foreach 取值
            foreach (var item in myDic)
            {
                Console.WriteLine("Key = {0}, Value = {1}", item.Key, item.Value);
            }
            //遍历字典
		    //foreach (KeyValuePair kvp in myDic)
		    //{
		        //Console.WriteLine("Key = {0}, Value = {1}", kvp.Key, kvp.Value);
		    //}

            //所有的值
            foreach (var item in myDic.Values)
            {
                Console.WriteLine("Value = {0}",item);
            }

            //所有的key
            foreach (var item in myDic.Keys)
            {
                Console.WriteLine("Key = {0}", item);
            }
            Console.ReadKey();
        }
    }
}

结果

Key = "1" already exists. 
key = "2", value = Dictionary.net2. 
key = "2". value = DictionaryNew.net2. 
key = "4". value = Dictionary.net4. 
key = "5": Dictionary.net5 
Key "1" is not found.
Key = 2. Value = DictionaryNew.net2 
Key = 3. Value = Dictionary.net3 
Key = 4. Value = Dictionary.net4 
Key = 5. Value — Dictionary.net5 
Value = DictionaryNew.net2 
Value = Dictionary.net3 
Value = Dictionary.net4 
Value = Dictionary.netS
Key = 2 
Key = 3 
Key = 4 
Key = 5

二、ConcurrentDictionary
ConcurrentDictionary 类表示可由多个线程同时访问的键/值对的线程安全集合。命名空间:System.Collections.Concurrent

ConcurrentDictionary属性和方法
1、ConcurrentDictionary的常用属性

属性 描述
Count 获取包含在 ConcurrentDictionary 中的键/值对的数目。
IsEmpty 获取一个值,该值指示 ConcurrentDictionary 是否为空。
Item[TKey] 获取或设置与指定的键关联的值。
Keys 获得一个包含 Dictionary 中的键的集合。
Values 获取包含 Dictionary 中的值的集合。

2、ConcurrentDictionary的常用方法

方法 描述
AddOrUpdate(TKey, Func, Func) 如果该键不存在,则使用第一个函数将键/值对添加到 ConcurrentDictionary;如果该键已存在,则使用第二个函数更新 ConcurrentDictionary 中的键/值对。
AddOrUpdate(TKey, TValue, Func) 如果该键不存在,则将键/值对添加到 ConcurrentDictionary 中;如果该键已经存在,则通过使用指定函数更新 ConcurrentDictionary 中的键/值对。
Clear() 将所有键和值从 ConcurrentDictionary 中移除。
ContainsKey(TKey) 确定是否 ConcurrentDictionary 包含指定键。
Equals(Object) 确定指定的对象是否等于当前对象。
GetEnumerator() 返回遍历 ConcurrentDictionary 的枚举器
GetHashCode() 作为默认哈希函数。
GetOrAdd(TKey, Func) 如果该键不存在,则通过使用指定的函数将键/值对添加到 ConcurrentDictionary 中。 如果该键存在,则返回新值或现有值。
GetOrAdd(TKey, TValue) 如果该键不存在,则将键/值对添加到 ConcurrentDictionary 中。 如果该键存在,则返回新值或现有值。
public KeyValuePair[] ToArray() 将 ConcurrentDictionary 中存储的键和值对复制到新数组中。
ToString() 返回表示当前对象的字符串。
TryAdd(TKey, TValue) 尝试将指定的键和值添加到 ConcurrentDictionary 中。
TryGetValue(TKey, TValue) 尝试从 ConcurrentDictionary 获取与指定的键关联的值。
TryRemove(TKey, TValue) 尝试从 ConcurrentDictionary 中移除并返回具有指定键的值。
TryUpdate(TKey, TValue, TValue) 如果具有 key 的现有值等于 comparisonValue,则将与 key 关联的值更新为 newValue。

你可能感兴趣的:(C#)