在C#中,System.Collections.Generic
命名空間下的Dictionary
類為以鍵值對(duì)的形式存儲(chǔ)和檢索數(shù)據(jù)提供了一種高效的方式。這種數(shù)據(jù)結(jié)構(gòu)功能強(qiáng)大、用途廣泛,并且針對(duì)快速數(shù)據(jù)查找進(jìn)行了高度優(yōu)化,使其非常適用于各種實(shí)際編程場(chǎng)景。
本文將讓你深入了解C#中的Dictionary<TKey, TValue>
——包括它的結(jié)構(gòu)、屬性、方法以及使用示例。
C#中的Dictionary
是什么?
Dictionary<TKey, TValue>
是一種泛型集合,它將數(shù)據(jù)存儲(chǔ)為鍵值對(duì)的形式。字典中的每個(gè)鍵都是唯一的,并且映射到一個(gè)值。在C#中,如果有高效的哈希函數(shù),字典對(duì)于添加、檢索和刪除數(shù)據(jù)等操作具有O(1)的時(shí)間復(fù)雜度,這使得它們成為高性能應(yīng)用程序的絕佳選擇。
Dictionary
的基本語(yǔ)法
要聲明一個(gè)字典,需要指定兩種類型:
以下是一個(gè)示例:
Dictionary<int, string> myDictionary = new Dictionary<int, string>();
在這個(gè)示例中,myDictionary
使用int
作為鍵類型,string
作為值類型。
Dictionary
的屬性
字典有幾個(gè)重要的屬性:
以下是展示如何使用這些屬性的示例:
var fruits = new Dictionary<string, int>
{
{"Apple", 1},
{"Banana", 2}
};
Console.WriteLine(fruits.Count); // 輸出:2
foreach (var key in fruits.Keys)
{
Console.WriteLine(key); // 輸出:Apple, Banana
}
foreach (var value in fruits.Values)
{
Console.WriteLine(value); // 輸出:1, 2
}
向字典中添加元素
要向字典中添加元素,可以使用Add
方法或者索引器語(yǔ)法[]
:
Dictionary<int, string> numbers = new Dictionary<int, string>();
numbers.Add(1, "One");
numbers[2] = "Two"; // 使用索引器語(yǔ)法
注意:如果嘗試使用Add
方法添加重復(fù)的鍵,將會(huì)拋出ArgumentException
異常。然而,索引器語(yǔ)法[]
在鍵已存在的情況下會(huì)更新對(duì)應(yīng)的值。
從字典中檢索值
最常見(jiàn)的檢索值的方式是使用鍵:
string value = numbers[1]; // 檢索與鍵1相關(guān)聯(lián)的值
如果鍵不存在,將會(huì)拋出KeyNotFoundException
異常。為了安全地處理這種情況,可以使用TryGetValue
方法,該方法在鍵存在時(shí)返回true
,并將關(guān)聯(lián)的值賦給out
參數(shù):
if (numbers.TryGetValue(2, out string result))
{
Console.WriteLine(result);
}
else
{
Console.WriteLine("鍵未找到");
}
更新現(xiàn)有值
要更新現(xiàn)有值,可以使用帶鍵的索引器語(yǔ)法:
numbers[1] = "Updated One";
如果鍵存在,關(guān)聯(lián)的值將會(huì)被更新;如果鍵不存在,將會(huì)添加一個(gè)新的鍵值對(duì)。
從字典中移除元素
要通過(guò)鍵移除一個(gè)元素,可以使用Remove
方法:
numbers.Remove(1); // 移除鍵為1的鍵值對(duì)
該方法在元素成功移除時(shí)返回true
,否則返回false
。
檢查鍵或值是否存在
要檢查字典中是否存在特定的鍵或值,可以使用ContainsKey
或ContainsValue
方法:
bool hasKey = numbers.ContainsKey(1); // 如果鍵1存在則返回true
bool hasValue = numbers.ContainsValue("Two"); // 如果值為"Two"被找到則返回true
遍歷字典
可以使用foreach
語(yǔ)句遍歷Dictionary
,其中每個(gè)元素都是一個(gè)KeyValuePair<TKey, TValue>
:
foreach (KeyValuePair<int, string> kvp in numbers)
{
Console.WriteLine($"鍵:{kvp.Key},值:{kvp.Value}");
}
或者,也可以使用Keys
和Values
屬性僅遍歷鍵或值。
初始化字典
字典可以在聲明時(shí)使用集合初始化器進(jìn)行初始化:
var myDictionary = new Dictionary<int, string>
{
{ 1, "One" },
{ 2, "Two" },
{ 3, "Three" }
};
Dictionary
的構(gòu)造函數(shù)
Dictionary
類針對(duì)不同場(chǎng)景提供了多個(gè)構(gòu)造函數(shù):
var myDictionary = new Dictionary<int, string>();
var myDictionary = new Dictionary<int, string>(100);
var caseInsensitiveDict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var anotherDictionary = new Dictionary<int, string>(myDictionary);
鍵的自定義比較器
默認(rèn)情況下,字典對(duì)鍵類型使用默認(rèn)的相等比較器。你可以通過(guò)實(shí)現(xiàn)IEqualityComparer<TKey>
來(lái)提供自定義的相等比較器。這對(duì)于不區(qū)分大小寫(xiě)的字符串鍵特別有用:
var caseInsensitiveDict = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
caseInsensitiveDict.Add("Hello", "World");
Console.WriteLine(caseInsensitiveDict.ContainsKey("hello")); // 輸出:True
線程安全與ConcurrentDictionary
Dictionary
類不是線程安全的。如果多個(gè)線程同時(shí)修改一個(gè)字典,可能會(huì)導(dǎo)致不可預(yù)測(cè)的行為。對(duì)于線程安全的操作,可以使用System.Collections.Concurrent
命名空間下的ConcurrentDictionary<TKey, TValue>
。
using System.Collections.Concurrent;
ConcurrentDictionary<int, string> safeDict = new ConcurrentDictionary<int, string>();
safeDict.TryAdd(1, "One");
Dictionary
的性能特征
由于哈希的作用,在大多數(shù)情況下,字典對(duì)于檢索、插入和刪除操作具有O(1)的復(fù)雜度,所以效率很高。然而,如果哈希函數(shù)不佳,性能可能會(huì)下降,導(dǎo)致沖突增多以及操作變慢。
Dictionary
操作中的常見(jiàn)異常
C#中的字典可能會(huì)拋出以下異常:
ArgumentNullException
:如果使用了空鍵。
ArgumentException
:如果使用Add
方法添加重復(fù)的鍵。
KeyNotFoundException
:如果訪問(wèn)字典中不存在的鍵。
示例程序
以下示例展示了字典的基本操作:
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
var dictionary = new Dictionary<int, string>
{
{1, "one"},
{2, "two"},
{3, "three"}
};
// 檢索值
Console.WriteLine(dictionary[2]); // 輸出:two
// 更新元素
dictionary[2] = "updated two";
// 移除元素
dictionary.Remove(1);
// 遍歷字典
foreach (var kvp in dictionary)
{
Console.WriteLine($"鍵:{kvp.Key},值:{kvp.Value}");
}
// 檢查存在性
Console.WriteLine(dictionary.ContainsKey(2)); // 輸出:True
}
}
C#中Dictionary
的總結(jié)
在C#中,Dictionary<TKey, TValue>
類是一種用于高效存儲(chǔ)鍵值對(duì)的重要數(shù)據(jù)結(jié)構(gòu)。它提供了廣泛的功能,用于添加、檢索、更新和移除元素,并且針對(duì)快速數(shù)據(jù)訪問(wèn)進(jìn)行了優(yōu)化。字典允許通過(guò)相等比較器進(jìn)行定制,支持多種初始化方法,使其適用于許多用例。
雖然Dictionary本身不是線程安全的,但ConcurrentDictionary<TKey, TValue>
為多線程應(yīng)用程序提供了一種安全的替代方案。無(wú)論你是在開(kāi)發(fā)簡(jiǎn)單還是復(fù)雜的應(yīng)用程序,C#中的字典都是一種用于將數(shù)據(jù)組織成鍵值對(duì)的強(qiáng)大、高性能的解決方案。
該文章在 2024/12/28 12:23:40 編輯過(guò)