C#编程(五十三)----------字典DictionaryTKey,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()方法的实现代码

 

转载于:https://www.cnblogs.com/android-blogs/p/6609872.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

setInterval只执行一次的原因

1 setInterval(arrow(),2000) 改为&#xff1a; 1 setInterval(arrow,2000) 原因&#xff1a; arrow()这是一个函数调用&#xff0c;函数调用就会有返回值&#xff0c; 而arrow()没有返回值&#xff0c;所以这里的arrow()是一个undefined&#xff0c;自然你想要的循环执行arrow…

java文件传输之文件编码和File类的使用

---恢复内容开始--- 我们知道&#xff0c;在用户端和服务端之间存在一个数据传输的问题&#xff0c;例如下载个电影、上传个照片、发一条讯息。在这里我们 就说一下文件的传输。 1.文件编码 相信大家小时候玩过积木&#xff08;没玩过也看过吧&#xff09;&#xff0c;看到一个…

Android 模拟输入那点事

因工作原因&#xff0c;需要用到模拟输入这个东东&#xff0c;查阅了一些资料&#xff0c;实现方式有多种&#xff0c;我大概分为两类&#xff0c;命令行类和程序类。 命令行类包括自动化测试组件monkeyrunner&#xff0c;getevent/setevent命令&#xff0c;input命令 程序类包…

arm-linux-gcc:Command not found的问题

标签&#xff1a; ubuntulinux 2015-05-15 10:47 680人阅读 评论(0) 收藏 举报 分类&#xff1a; Ubuntu&#xff08;23&#xff09; /etc/profile gcc&#xff08;9&#xff09; ARM汇编指令&#xff08;4&#xff09; 折腾了一天&#xff0c;终于搞定了。 ubuntu没有roo…

[No0000111]java9环境变量配置bat

保存成bat&#xff08;utf-8 无签名 编码&#xff09; 右键以管理员权限运行 修改JAVAINSTALLPATH 为JAVA SDK 安装目录&#xff08;默认用C:\PROGRAM FILES\JAVA\&#xff09;即可&#xff1b; 只在 用户变量下 创建&#xff0c;会事先保存好用户原有的“JAVA_HOME,JRE_HOME,P…

去掉浮夸,空杯心态重新面对测试

刚开始一头扎进软件测试行业&#xff0c;从踏踏实实的机械化功能测试&#xff0c;到学会和甲方扯皮&#xff0c;到被鄙视的五体投地后抓紧修炼表面功夫来忽悠人&#xff0c;学的最多的反而是怎么与人交流。第一次面对跳槽的机会&#xff0c;我竟然发现自己的测试能力不升反降。…

PASTE Splay

题目描述 我们用文本处理器来处理一个特殊的文本文件&#xff0c;该文本文件共有N行文本&#xff0c;每一行文本仅包含一个自然数&#xff0c;第一行为1、第二行为2&#xff0c;以此类推至N行为自然数N。   假设对该文本文件执行一次“剪切和粘贴”操作含义如下&#xff1a;…

linux 用户空间通过makefile向程序传递参数

一. 用户空间 因为实际上进行预处理的只是Gcc工具&#xff0c;而make工具只是一个解决依赖关系的工具。所以问题就简化成如何通过make向gcc传递参数。通过简单的例子来说明&#xff1a;hello.c#include <stdio.h> void main(void) {#ifdef DEBUG printf("y…

Spring---基于Spring IOC的小程序

实现的功能以及各文件间的关系 IHelloMessage&#xff1a;一个接口&#xff0c;用于定义输出问候信息。 HelloWorld、HelloChina&#xff1a;接口的实现类。在这里表示人在不同的地方 Person&#xff1a;一个人物类&#xff0c;调用IHelloMessage接口&#xff0c;向用户输出问候…

Web开发者不可不知的16条原则

HTML已经走过了近20的发展历程。从HTML4到XHTML&#xff0c;再到最近十分火热的HTML5&#xff0c;它几乎见证了整个互联网的发展。但是&#xff0c;即便到现在&#xff0c;有很多基础的概念和原则依然需要开发者高度注意。下面&#xff0c;小编向大家介绍这些应该遵循的开发原则…

MIPI DSI协议介绍

原文地址&#xff1a;http://blog.csdn .NET/qq160816/article/details/19555957 一、MIPI MIPI&#xff08;移动行业处理器接口&#xff09;是Mobile Industry Processor Interface的缩写。MIPI&#xff08;移动行业处理器接口&#xff09;是MIPI联盟发起的为移动应用处理器制…

NSArray、NSDictionary、NSString存储、删改、遍历

NSString 创建一个NSString实例&#xff1a;NSString *str “this is string”;//字面量语法 常用API&#xff1a; stringWithFormat //创建动态字符串 -&#xff08;NSUInteger&#xff09;length //获取字符的数量 -isEqualToString: //判断两个字符串是否相等 -uppercaseSt…

2018.11.14成立我的博客

2018.11.14成立我的博客转载于:https://www.cnblogs.com/zengxx/p/9957509.html

130242014018-郑志良-第2次实验

一、实验目的 1&#xff0e;熟悉体系结构的风格的概念 2&#xff0e;理解和应用管道过滤器型的风格。 3、理解解释器的原理 4、理解编译器模型 二、实验环境 硬件&#xff1a; 软件&#xff1a;Python或任何一种自己喜欢的语言 三、实验内容 1、实现“四则运算”的简易翻译器。…

Hi3516A开发--挂载SD卡和U盘

一、SD卡 1、通过fdisk -l命令确认板子上的Linux系统是否识别SD卡 / # fdisk -l Disk /dev/mmcblk0: 63.8 GB, 63864569856 bytes 255 heads, 63 sectors/track, 7764 cylinders Units cylinders of 16065 * 512 8225280 bytes Device Boot Start …

【BZOJ 4170】 4170: 极光 (CDQ分治)

4170: 极光 Time Limit: 30 Sec Memory Limit: 512 MBSubmit: 121 Solved: 64Description "若是万一琪露诺&#xff08;俗称rhl&#xff09;进行攻击&#xff0c;什么都好&#xff0c;冷静地回答她的问题来吸引她。对方表现出兴趣的话&#xff0c;那就慢慢地反问。在她考…

自动生成web服务器日志解析规则

2019独角兽企业重金招聘Python工程师标准>>> 当前web服务器的多样化使得访问日志的数据清洗变得越来越复杂&#xff0c;企业需要投入专业的数据清洗人员编写数据清洗规则&#xff08;解析规则或者解析正则&#xff09;&#xff0c;或者需要关心web服务器访问日志的生…

mybatis一级缓存二级缓存

一级缓存 Mybatis对缓存提供支持&#xff0c;但是在没有配置的默认情况下&#xff0c;它只开启一级缓存&#xff0c;一级缓存只是相对于同一个SqlSession而言。所以在参数和SQL完全一样的情况下&#xff0c;我们使用同一个SqlSession对象调用一个Mapper方法&#xff0c;往往只执…

CMOS Sensor的调试分享

目前&#xff0c;包括移动设备在内的很多多媒体设备上都使用了摄像头&#xff0c;而且还在以很快的速度更新换代。目前使用的摄像头分为两种&#xff1a;CCD(Charge Couple Device电荷偶合器件)和 CMOS(Complementary Metal Oxide Semiconductor互补金属氧化物半导体)。这两种各…

利用反射修改final数据域

当final修饰一个数据域时&#xff0c;意义是声明该数据域是最终的&#xff0c;不可修改的。常见的使用场景就是eclipse自动生成的serialVersionUID一般都是final的。 另外还可以构造线程安全&#xff08;thread safe&#xff09;的immutable类&#xff0c;比如String&#xff0…