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.pswp.cn/news/253048.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/253048.shtml
英文地址,請注明出處:http://en.pswp.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…