C#高级编程五十三天----字典Dictionary<TKey,TValue>

字典

关键字:Dicitionary

说明:

必须包含命名空间System.Collection.Generic

Dictionary里面的每一个元素都是一个键值对(由两个元组组成:键和值).

键必须是唯一的,而值不需要唯一的.

键和值都可以是任意类型(例如:string,int,自定义类型,等等)

通过一个键读取一个值的事件是接近O(1)

键值对之间的偏序可以不定义

使用案例:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Collections.Generic;

namespace 字典

{

class Program

{

static void Main(string[] args)

{

//定义

Dictionary<string, string> openWith = new Dictionary<string, string>();

//添加元素

openWith.Add("txt", "notepad.exe");

openWith.Add("bmp", "paint.exe");

openWith.Add("dib", "paint.exe");

openWith.Add("rtf", "wordpad.exe");

//取值

Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);

//更改值

openWith["rtf"] = "winword.exe";

//查看

Console.WriteLine("For key = \"rtf\", value = {0}.", openWith["rtf"]);

//遍历Key

foreach (var item in openWith.Keys)

{

Console.WriteLine("Key = {0}", item);

}

//遍历value

foreach (var item in openWith.Values)

{

Console.WriteLine("value = {0}", item);

}

//遍历value的第二种方法

Dictionary<string, string>.ValueCollection valueColl = openWith.Values;

foreach (var item in valueColl)

{

Console.WriteLine("value = {0}", item);

}

//遍历字典

foreach (KeyValuePair<string, string> item in openWith)

{

Console.WriteLine("key = {0} , value = {1} ", item.Key, item.Value);

}

//添加存在的元素

try

{

openWith.Add("txt", "winword.exe");

}

catch (ArgumentException)

{

Console.WriteLine("An element with Key = \"txt\" already exists.");

}

//删除元素

openWith.Remove("doc");

if (!openWith.ContainsKey("doc"))

{

Console.WriteLine("Key \"doc\" is not found.");

}

//判断键存在

if (openWith.ContainsKey("bmp"))

{

Console.WriteLine("An element with Key = \"bmp\" exists.");

}

//参数为其他类型

Dictionary<int, string[]> OtherType = new Dictionary<int, string[]>();

OtherType.Add(1, "1,11,111".Split(‘,‘));

OtherType.Add(2, "2,22,222".Split(‘,‘));

Console.WriteLine("其他类型 : " + OtherType[1][2]);

//参数为自定义类型

//声明并添加元素

Dictionary<int, DouCube> MyType = new Dictionary<int, DouCube>();

for (int i = 1; i <= 9; i++)

{

DouCube element = new DouCube();

element.Code = i * 100;

element.Page = "http://www.doucube.com/" + i.ToString() + ".html";

MyType.Add(i, element);

}

//遍历元素

foreach (KeyValuePair<int, DouCube> kvp in MyType)

{

Console.WriteLine("Index {0} Code:{1} Page:{2}", kvp.Key, kvp.Value.Code, kvp.Value.Page);

}

}

}

public class DouCube

{

public int Code { get { return _Code; } set { _Code = value; } } private int _Code;

public string Page { get { return _Page; } set { _Page = value; } } private string _Page;

}

}

常用属性


名称


说明


Comparer


获取用于确定字典中的键是否相等的IEqualityComParer<T>


Count


获取包含在Dictionary<TKey,TValue>中的键/值对的数目


Item


获取或设置与指定的键相关联的值


Keys


获取包含Dictionary<TKey,TValue>中的键的集合


Values


获取包含Dictionary<TKey,TValue>中的值的集合

常用方法


名称


说明


Add


将指定的键和值添加到字典中


Clear


从Dictionary<TKey,TValue>中移除所有的键和值


ContainsKey


确定Dictionary<TKey,TValue>是否包含指定的键


ContainsValue


确定Dictionary<TKey,TValue>是否包含指定的值


Equals(object)


确定指定的Object是否等于当前的object(继承自object)


Finalize


允许对象在”垃圾回收”回收之前尝试释放资源并执行其他清理操作(继承自object)


GetEnumerator


返回循环访问Dictionary<TKey,TValue>的枚举器


GetHashCode


用作特定类型的哈希函数(继承自object)


GetObjectData


实现System.Runtime.Serialization.ISerializable接口,并返回序列化Dictionary<TKey,TValue>实例所需的数据


GetType


获取当前实例的Type(继承自Object)


MemberwiseClone


创建当前object的浅表副本(继承自Object)


OnDeserialization


实现System.Runtime.Serialization.ISerializable接口,并在完成反序列化之后引发序列化事件


Remove


从Dictionary<TKey,Tvalue>中移除所指定的键的值


ToString


返回表示当前对象的字符串


TryGetValue


获取与指定的键相关联的值.

总结Dictionary:

字典也称为映射表或散列表,主要特定是可以根据键快速查找值,也可以自由删除添加元素,在删除添加时,不会像列表一样,移动之后的所有元素,产生内存的开销.

.NET中提供了几个字典,可以使用最主要的类是Dictionary<TKey,TValue>,这个类与我们上面说的SoreedList用法完全一样.

键的类型:

用作字典中键的类型必须重写object类中的GetHashCode()方法,只要字典类需要确定元素的位置,就要调用本方法.

字典内部通过调用这个方法的返回值,来计算产生散列(这是一个算法,不去研究,它涉及一个素数),所以字典的容量是一个素数.

GetHashCode()方法的实现需要遵循以下几点:

1.相同的对象应总是返回相同的值

2.不同的对象可以返回相同的值

3.应执行额比较快,计算的开销不大

4.不能抛出异常

5.应至少使用一个实例字段

6.散列码值应平均分布在int可以存储的整个数字区域

7.散列码最好在对象的生存期中不发生变化

提示:字典的性能取决于GetHashCode()方法的实现代码

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 16:53:13

C#高级编程五十三天----字典Dictionary<TKey,TValue>的相关文章

C#编程(五十三)----------字典Dictionary&lt;TKey,TValue&gt;

字典 关键字:Dicitionary 说明: 必须包含命名空间System.Collection.Generic Dictionary里面的每一个元素都是一个键值对(由两个元组组成:键和值). 键必须是唯一的,而值不需要唯一的. 键和值都可以是任意类型(例如:string,int,自定义类型,等等) 通过一个键读取一个值的事件是接近O(1) 键值对之间的偏序可以不定义 使用案例: using System; using System.Collections.Generic; using Syst

C#中数组、集合(ArrayList)、泛型集合List&lt;T&gt;、字典(dictionary&lt;TKey,TValue&gt;)全面对比

为什么把这4个东西放在一起来说,因为c#中的这4个对象都是用来存储数据的集合--. 首先咱们把这4个对象都声明并实例化一下: //数组 string[] m_Str = new string[5]; //集合 ArrayList m_AList = new ArrayList(); //泛型集合 List<int> m_List = new List<int>(); //字典 Dictionary<int, string> m_Dt = new Dictionary&l

字典---Dictionary&lt;TKey,TValue&gt;

=================================================EmployeeID.cs(学生编号类) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication7 {     //作为键的类型必须要重写GetHashCode()  

C#高级编程五十四天----Lookup类和有序字典

Lookup类 Dictionary<Tkey,TValue>只为每个键支持一个值.新类Lookup<Tkey,TValue>是.NET3.5中新增的,它类似与Dictionary<Tkey,TElement>,但把键映射带一个值集上.这个类在程序及System.Core中实现,用System,Linq命名空间定义. Lookup<Tkey,TElement>的方法和属性如下表: 属性名或者方法名 说明 Count 属性Count返回集合中的元素个数 Ite

C#高级编程五十九天----集合的性能

各种集合的性能 许多集合类提供了相同的功能,例如,SortedList类与SortedDictionary类的功能几乎完全相同.但是,其性能常常有很大的区别.SortedList集合使用的内存少,SortedDictionary集合的元素检索速度快. 在MSDN文档中,集合的方法常常有性能提示,给出了以大O(字母)表示的操作时间: O(1) O(log n) O(n) O(1)表示无论集合中有多少数据项,这个操作需要的时间都不变.例如ArrayList类的Add()方法就具有O(1)行为.无论列

c# 扩展方法奇思妙用基础篇五:Dictionary&lt;TKey, TValue&gt; 扩展

Dictionary<TKey, TValue>类是常用的一个基础类,但用起来有时确不是很方便.本文逐一讨论,并使用扩展方法解决. 向字典中添加键和值 添加键和值使用 Add 方法,但很多时候,我们是不敢轻易添加的,因为 Dictionary<TKey, TValue>不允许重复,尝试添加重复的键时 Add 方法引发 ArgumentException. 大多时候,我们都会写成以下的样子: var dict = new Dictionary<int, string>()

Dictionary&lt;TKey, TValue&gt; 类

C# Dictionary<TKey, TValue> 类 Dictionary<TKey, TValue> 泛型类提供了从一组键到一组值的映射.字典中的每个添加项都由一个值及其相关联的键组成.通过key检索值的速度非常快,其时间复杂度为常数阶 O(1),因为 Dictionary<TKey, TValue> 类是以哈希表的方式实现的. 只要对象用作键在 Dictionary<TKey, TValue>,不得更改任何会影响其哈希值的方式.每个在 Dictio

.net源码分析 – Dictionary&lt;TKey, TValue&gt;

接上篇:.net源码分析 – List<T> Dictionary<TKey, TValue>源码地址:https://github.com/dotnet/corefx/blob/master/src/System.Collections/src/System/Collections/Generic/Dictionary.cs 接口 Dictionary<TKey, TValue>和List<T>的接口形式差不多,不重复说了,可以参考List<T>

自定义一个可以被序列化的泛型Dictionary&lt;TKey,TValue&gt;集合

Dictionary是一个键值类型的集合.它有点像数组,但Dictionary的键可以是任何类型,内部使用Hash Table存储键和值.本篇自定义一个类型安全的泛型Dictionary<TKey, TValue>,并且可以被序列化. 为了使自定义的泛型Dictionary<TKey, TValue>可以被序列化成xml,需要实现泛型IXmlSerializable接口. public class MySerializableDictionary<TKey, TValue&g