標籤:tostring not 訪問 異常 equal 等於 hashcode int tar
字典
關鍵字: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()方法的實現代碼
C#編程(五十三)----------字典Dictionary<TKey,TValue>