我的编程空间,编程开发者的网络收藏夹
学习永远不晚

C#字典的使用方法是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

C#字典的使用方法是什么

这篇文章主要介绍“C#字典的使用方法是什么”,在日常操作中,相信很多人在C#字典的使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#字典的使用方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

字典表示一种复杂的数据结构,这种数据结构允许按照某个键来访问元素。字典也称为映射或散列表。
字典的主要特性是能根据键快速查找值。也可以自由添加和删除元素,这有点像List<T>,但没有在内存中移动后续元素的性能开销。
下图是一个简化表示,键会转换位一个散列。利用散列创建一个数字,它将索引和值关联起来。然后索引包含一个到值的链接。一个索引项可以关联多个值,索引可以存储为一个树型结构。

C#字典的使用方法是什么

.NET Framework提供了几个字典类。最主要的类是Dictionary<TKey,TValue>。

1.键的类型

用作字典中的键的类型必须重写Object类的GetHashCode()方法。只要字典类需要确定元素的位置,它就要调用GetHashCode()方法。GetHashCode()方法返回的int有字典用于计算在对应位置放置元素的索引。后面介绍这个算法,现在只需要知道它涉及素数,所以字典的容量是一个素数。
GetHashCode()方法的实现代码必须满足的要求:

  • *相同的对象应总是返回相同的值

  • *不同的对象可以返回相同的值

  • *它应执行的比较快,计算的开销不大

  • *它不能抛出异常

  • *它应至少使用一个实例字段

  • *散列代码值应平均分布在int可以存储的这个数字范围上

  • *散列代码最好在对象的生存期中不发生变化

字典的性能取决于GetHashCode()方法的实现代码。
散列代码值应平均分布在int可以存储的这个数字范围上的原因:
如果两个键返回的散列代码值会得到相同的索引,字典类就必须寻找最近的可用空闲位置来存储第二个数据项,这需要进行一定的搜索,以便以后检索这一项。显然这会降低性能,如果在排序的时候许多键都有相同的索引这中冲突会更可能出现。根据Microsoft的算法工作方式,当计算出来的散列代码值平均分布在int.MinValue和int.MaxValue之间时,这种风险会降到最低。
除了实现GetHashCode()方法之外,键类型还必须实现IEquatable<T>.Equals()方法,或重写Object.Equals()方法。0因为不同的键对象可能返回相同的散列代码,所以字典使用Equals()方法来比较键。字典检查两个键A和B是否相等,并调用A.Equals(B)方法。这表示必须确保下述条件总是成立:
如果A.Equals(B)返回true,则A.GetHashCode()和B.GetHashCode()总是返回相同的散列代码。
这听起来有点奇怪,但它很重要。如果上述条件不成立,这个字典还能工作,但会出现,把一个对象放在字典中后,就再也检索不到它,或者返回了错误的项。
所以,如果为Equals()方法提供了重写版本,但没提供GetHashCode()方法的重写版本,C#编译器会显示一个警告。
对于System.Object,这个条件为true,因为Equals()方法只是比较引用,GetHashCode()方法实际上返回一个仅基于对象地址的散列代码。这说明,如果散列表基于一个键,而该键没有重写这些方法,这个散列表可以工作,但只有对象完全相同,键才被认为是相等的。也就是说,把一个对象放在字典中时,必须将它与该键的引用关联起来。也不能以后用相同的值实例化另一个键对象。如果没有重写Equals()方法和GetHashCode()方法,在字典中使用类型时就不太方便。
System.String实现了IEquatable接口,并重载了GetHashCode()方法。Equals()方法提供了值的比较,GetHashCode()方法根据字符串的值返回一个散列代码。因此,在字典中把字符串用在键很方便。
数字类型(如Int32)也实现了IEquatable接口,并重载了GetHashCode()方法。但是这些类型返回的散列代码只能映射到值上。如果希望用作键的数字本身没有分布在可能的整数值范围内,把整数用作键就不能满足键值的平均分布规则,于是不能获得最佳的性能。Int32并不适合在字典中使用。
如果需要使用的键类型没有实现IEquatable接口,并根据存储在字典中的键值重载GetHashCode()方法,就可以创建一个实现IEqualityComparer<T>接口的比较器。IEqualityComparer<T>接口定义了GetHashCode()方法和Equals()方法,并将传递的对象作为参数,这样可以提供与对象类型不同的实现方式。

2.演示字典

创建一个员工ID(EmployeeId)结构,用作字典的键。存储在字典中的数据是Employee类型的对象。
该结构的成员是表示员工的一个前缀字符和一个数字。这两个变量都是只读的,只能在构造函数中初始化。字典中的键不应改变,这是必须保证的。 

      public struct EmployeeId : IEquatable<EmployeeId>          {            private readonly char prefix;            private readonly int number;            public EmployeeId(string id)            {              Contract.Requires<ArgumentNullException>(id != null);              prefix = (id.ToUpper())[0];              int numLength = id.Length - 1;              try              {                number = int.Parse(id.Substring(1, numLength > 6 ? 6 : numLength));              }              catch (FormatException)              {                throw new Exception("Invalid EmployeeId format");              }            }            public override string ToString()            {              return prefix.ToString() + string.Format("{0,6:000000}", number);            }                        //由于没有填满整数取值范围,GetHashCode方法将数字向左移动16位,再与原来的数字进行异或操作,            //最后将结果乘以16进制数0x15051505。这样,散列代码在整数取值区域上的分布就很均匀。            public override int GetHashCode()            {              return (number ^ number << 16) * 0x15051505;            }            public bool Equals(EmployeeId other)            {              if (other == null) return false;              return (prefix == other.prefix && number == other.number);            }            //比较两个EmployeeId对象的值            public override bool Equals(object obj)            {              return Equals((EmployeeId)obj);            }            public static bool operator ==(EmployeeId left, EmployeeId right)            {              return left.Equals(right);            }            public static bool operator !=(EmployeeId left, EmployeeId right)            {              return !(left == right);            }          }              public class Employee          {            private string name;            private decimal salary;            private readonly EmployeeId id;            public Employee(EmployeeId id, string name, decimal salary)            {              this.id = id;              this.name = name;              this.salary = salary;            }            public override string ToString()            {              return String.Format("{0}: {1, -20} {2:C}",                    id.ToString(), name, salary);            }          }

客户端代码:

    static void Main()        {            //构造函数指定了31个元素的容量。容量一般是素数。            //如果指定了一个不是素数的值,Dictionary<TKey,TValue>类会使用指定的整数后面紧接着的一个素数          var employees = new Dictionary<EmployeeId, Employee>(31);          var idTony = new EmployeeId("C3755");          var tony = new Employee(idTony, "Tony Stewart", 379025.00m);          employees.Add(idTony, tony);          Console.WriteLine(tony);          var idCarl = new EmployeeId("F3547");          var carl = new Employee(idCarl, "Carl Edwards", 403466.00m);          employees.Add(idCarl, carl);          Console.WriteLine(carl);          var idKevin = new EmployeeId("C3386");          var kevin = new Employee(idKevin, "Kevin Harwick", 415261.00m);          employees.Add(idKevin, kevin);          Console.WriteLine(kevin);          var idMatt = new EmployeeId("F3323");          var matt = new Employee(idMatt, "Matt Kenseth", 1589390.00m);          employees[idMatt] = matt;          Console.WriteLine(matt);          var idBrad = new EmployeeId("D3234");          var brad = new Employee(idBrad, "Brad Keselowski", 322295.00m);          employees[idBrad] = brad;          Console.WriteLine(brad);        }

3.Lookup类

Dictionary<TKey,TValue>类支持每个键关联一个值。Lookup<TKey,TElement>类把键映射到一个值集上。这个类在程序集System.Core中实现,用System.Linq定义。
Lookup<TKey,TElement>类不能像一般的字典那样创建,必须调用ToLookup()方法,该方法返回一个Lookup<TKey,TElement>对象。ToLookup()方法是一个扩展方法,它可以用于实现了IEnumerable<T>接口的所有类。
ToLookup()方法需要一个Func<TSource,Tkey>,Func<TSource,Tkey>定义了选择器。  

    static void Main()    {          var racers = new List<Racer>();          racers.Add(new Racer(26, "Jacques", "Villeneuve", "Canada", 11));          racers.Add(new Racer(18, "Alan", "Jones", "Australia", 12));          racers.Add(new Racer(11, "Jackie", "Stewart", "United Kingdom", 27));          racers.Add(new Racer(15, "James", "Hunt", "United Kingdom", 10));          racers.Add(new Racer(5, "Jack", "Brabham", "Australia", 14));          //国家相同的对象关联到一个键          var lookupRacers = racers.ToLookup(r => r.Country);          foreach (Racer r in lookupRacers["Australia"])          {            Console.WriteLine(r);          }    }

输出:

  Alan Jones  Jack Brabham

4.有序字典

SortedDictionary<TKey,TValue>类是一个二叉搜索树,其中的元素根据键来排序。该键类型必须实现IComparable<TKey>接口。
如果键的类型不能排序,还可以创建一个实现了IComparer<TKey>接口的比较器,将比较器用作有序字典的构造函数的一个参数。
SortedDictionary<TKey,TValue>和有序列表SortedList<TKey,TValue>的区别:

  • *SortedList<TKey,TValue>类使用的内存比SortedDictionary<TKey,TValue>少。

  • *SortedDictionary<TKey,TValue>元素的插入和删除操作比较快。

  • *在用已排序好的数据填充集合时,若不需要改变容量,ortedList<TKey,TValue>比较快。

到此,关于“C#字典的使用方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

C#字典的使用方法是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#字典的使用方法是什么

这篇文章主要介绍“C#字典的使用方法是什么”,在日常操作中,相信很多人在C#字典的使用方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#字典的使用方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-30

python字典用法是什么

python字典用法是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。创建字典python 创建字典可以使用 dict 函数,或者使用花括号,用花括号的方式更
2023-06-22

Python字典的运算方法是什么

本篇内容介绍了“Python字典的运算方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!问题描述怎样在数据字典中执行一些计算操作(比如
2023-06-22

python字典赋值的方法是什么

Python中的字典是一种无序的键值对集合,每个键值对之间用逗号分隔,整个字典用花括号{}括起来表示。字典中的键必须是唯一的,而值可以重复。字典的赋值操作可以通过两种方式实现:1、直接赋值法使用花括号{}创建一个字典,然后将其赋值给变量。`
2023-05-13

python字典创建的方法是什么

Python字典有多种创建的方法,以下是几种常见的方法:使用花括号{}创建一个空字典:my_dict = {}使用花括号{}创建一个包含键值对的字典:my_dict = {'key1': 'value1', 'key2': 'value
2023-10-23

python字典查找key的方法是什么

在Python中,可以使用以下方法来查找字典中的键:1. 使用索引操作符([]):可以通过使用键作为索引来访问字典中的值。如果键不存在于字典中,会引发KeyError异常。```pythonmy_dict = {'name': 'John'
2023-09-20

Mysql生成数据字典的方法是什么

生成MySQL数据库的数据字典可以通过以下方法:使用MySQL Workbench:MySQL Workbench是一个强大的MySQL数据库管理工具,可以通过它生成数据库文档。在MySQL Workbench中连接到数据库,选择要生成数据
Mysql生成数据字典的方法是什么
2024-04-09

java链表字典排序的方法是什么

在Java中,可以使用Collections.sort()方法对链表进行字典排序。具体步骤如下:创建一个链表LinkedList对象,并添加需要排序的元素。使用Collections.sort()方法对链表进行排序。该方法接受一个List
2023-10-24

c语言转义字符的使用方法是什么

在C语言中,转义字符以反斜杠(\)开头,用于表示一些特殊字符或控制字符,例如换行符(\n)、制表符(\t)、回车符(\r)、退格符(\b)等。转义字符的使用方法是在需要输入特殊字符时,在字符前加上反斜杠即可。例如,要在字符串中输出换行符,可
c语言转义字符的使用方法是什么
2024-03-01

Python字典items()方法怎么使用

字典的items()方法用于返回字典中所有键值对的视图。该方法返回一个可迭代的对象,其中每个元素都是一个包含键和对应值的元组。以下是使用items()方法的示例:```python# 创建一个字典my_dict = {'name': 'Jo
2023-10-12

Python中常用的字典键和值排方法是什么

这篇“Python中常用的字典键和值排方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python中常用的字典键和值
2023-07-05

python字典创建和排序的方法是什么

在Python中,可以使用大括号({})来创建字典。字典是一种无序的键值对集合,可以用来存储任意类型的数据。创建字典的方法有两种:1. 直接赋值法:```pythonmy_dict = {'key1': value1, 'key2': va
2023-10-12

python字典合并值相加的方法是什么

要合并两个字典的值并相加,可以使用以下方法:dict1 = {'a': 10, 'b': 20}dict2 = {'a': 5, 'c': 30}resul
python字典合并值相加的方法是什么
2024-03-02

Python中字典存储元组的方法是什么

在Python中,可以使用字典来存储元组。字典中的元素是以键值对的形式存储的,其中键可以是任意不可变的数据类型,比如字符串、整数、元组等。而值可以是任意数据类型,包括元组。要在字典中存储元组,可以使用元组作为键或值,如下所示:# 使用元
Python中字典存储元组的方法是什么
2024-04-23

python字典修改键值对的方法是什么

要修改Python字典中的键值对,可以使用以下两种方法:使用索引操作符([])来访问指定的键,并将新的值赋给它。# 创建一个字典d = {'key1': 'value1', 'key2': 'value2'}# 修改键为'key1'的值
2023-10-27

python字典添加键和值的方法是什么

Python字典添加键值对的方法有两种:1. 使用索引赋值:可以通过索引的方式给字典添加键和值。例如:```my_dict = {} # 创建一个空字典my_dict["key"] = "value" # 添加键和值```2. 使用`u
2023-09-28

python字典保存和读取的方法是什么

在Python中,可以使用pickle模块来保存和读取字典。保存字典到文件:```import picklemy_dict = {'key1': 'value1', 'key2': 'value2'}# 打开文件,以二进制写入模式with
2023-08-08

C语言中trie字典树是什么

这篇文章给大家分享的是有关C语言中trie字典树是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。字典树介绍字典树简单的是用一个二维数组表示,如果想更加节省空间,大神的做法肯定是用指针链表来搞定了。比如我们用g
2023-06-03

C#委托的使用方法是什么

在C#中,委托是一种类型,用于引用一个或多个方法。委托可以看作是函数指针,它可以被用来调用方法。使用委托的步骤如下:定义委托:首先需要定义一个委托类型,指定委托可以引用的方法签名。例如:delegate void MyDelegate(i
C#委托的使用方法是什么
2024-03-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录