前言
在 C# 中,集合可以分泛型集合和非泛型集合兩種主要類(lèi)型。兩種集合類(lèi)型在類(lèi)型、安全性、可用性和性能特征等方面有所不同。而在大多數(shù)情況下,建議使用泛型集合,因?yàn)樗鼒?zhí)行速度比非泛型集合快,并且通過(guò)提供編譯時(shí)錯(cuò)誤來(lái)最大限度地減少異常。本文了解泛型和非泛型集合兩種類(lèi)型的概述。
泛型集合
1、概述
泛型集合類(lèi)型可以用來(lái)儲(chǔ)存任何類(lèi)型的數(shù)據(jù),由 Collections.Generic 命名空間提供。
HashSet<string> hashSet = new HashSet<string>();
List<int> numbers = new List<int>();
2、特征
提供強(qiáng)大的類(lèi)型安全性,在聲明元素時(shí),允許指定包含的元素類(lèi)型。類(lèi)型的安全性在編譯時(shí)強(qiáng)制執(zhí)行,以防止與類(lèi)型相關(guān)的運(yùn)行時(shí)錯(cuò)誤。
在從集合中檢索元素時(shí)無(wú)需顯式強(qiáng)制轉(zhuǎn)換,對(duì)使用者更友好,在編碼時(shí),可以使用強(qiáng)類(lèi)型元素,使代碼更具可讀性且不易出錯(cuò)。
避免裝箱和取消裝箱的開(kāi)銷(xiāo),使得在執(zhí)行速度和內(nèi)存使用方面都更有效。為值類(lèi)型提供了更好的性能,并且在檢索元素時(shí)不需要強(qiáng)制轉(zhuǎn)換。
3、示例
// 定義數(shù)字列表
List<int> numbers = new List<int>();
// 使用 Add 方法添加元素
numbers.Add(1);
numbers.Add(3);
// 輸出列表元素
for (int i = 0; i < numbers.Count; i++)
{
Console.WriteLine(numbers[i]);
}
// 定義客戶(hù)對(duì)象列表
var customers = new List<Customer>() {
new Customer(){ Code = "Haiwei", Name="華為"},
new Customer(){ Code = "Xiaomi", Name="小米"},
};
// 輸出列表元素
foreach (var customer in customers)
{
Console.WriteLine(customer.Code);
}
public class Customer
{
public string Code { get; set; }
public string Name { get; set; }
}
// 定義字典
Dictionary<string, int> dictionary = new Dictionary<string, int>();
// 添加元素
dictionary.Add("Xiaomi", 50);
// 遍歷元素
foreach (KeyValuePair<string, int> dict in dictionary)
{
Console.WriteLine(dict.Key);
}
Console.WriteLine(dictionary["Xiaomi"]);
// 定義字符串隊(duì)列
Queue<string> queues = new Queue<string>();
// 添加元素
queues.Enqueue("A001");
queues.Enqueue("A002");
// 遍歷元素
foreach (string queue in queues)
{
Console.WriteLine(queue);
}
// 定義字符串無(wú)序集
HashSet<string> languages = new HashSet<string>();
// 添加元素
languages.Add("English");
languages.Add("Simplified");
languages.Add("Traditional");
// 遍歷元素
foreach (var language in languages)
{
Console.WriteLine(language);
}
// 定義整數(shù)鏈表
LinkedList<int> linkedList = new LinkedList<int>();
// 添加元素
linkedList.AddLast(11);
linkedList.AddFirst(12);
// 判斷元素
if (linkedList.Contains(11))
{
Console.WriteLine("鏈表中存在11");
}
// 遍歷元素
foreach (int item in linkedList)
{
Console.WriteLine(item);
}
// 定義字符串堆棧
Stack<string> stacks = new Stack<string>();
// 添加元素
stacks.Push("one");
stacks.Push("two");
// 遍歷元素
foreach (string stack in stacks)
{
Console.WriteLine(stack);
}
非泛型集合
1、概述
非泛型集合主要用于存儲(chǔ)多種類(lèi)型的對(duì)象,具有較高的靈活性,但性能和類(lèi)型安全性較差。由 System.Collections 命名空間提供。
ArrayList list = new ArrayList();
Hashtable hashtable = new Hashtable();
2、特征
非泛型集合將元素存儲(chǔ)為對(duì)象類(lèi)型,并且在檢索元素時(shí)通常需要顯式強(qiáng)制轉(zhuǎn)換,因此它不是類(lèi)型安全的。與類(lèi)型相關(guān)的錯(cuò)誤只能在運(yùn)行時(shí)發(fā)現(xiàn)。
在處理元素時(shí)涉及強(qiáng)制轉(zhuǎn)換和裝箱/取消裝箱操作,由于強(qiáng)制轉(zhuǎn)換會(huì)使代碼的可讀性降低且更容易出錯(cuò),從而降低其可用性。
由于存在裝箱和取消裝箱,使得非泛型集合可能會(huì)產(chǎn)生性能開(kāi)銷(xiāo),可能會(huì)導(dǎo)致性能下降,尤其在使用值類(lèi)型。
3、示例
// 定義非泛型動(dòng)態(tài)數(shù)組
ArrayList arrayLists = new ArrayList();
// 添加整數(shù)元素
arrayLists.Add(1);
// 添加字符串元素
arrayLists.Add("A");
// 添加布爾值元素
arrayLists.Add(true);
// 遍歷元素
for (int i = 0; i < arrayLists.Count; i++)
{
Console.WriteLine(arrayLists[i]);
}
// 定義哈希表
Hashtable hashtable = new Hashtable();
// 添加A鍵值為 1
hashtable.Add("A", 1);
// 添加B鍵值為 true
hashtable.Add("B", true);
// 添加C鍵值為 C0001
hashtable.Add("C", "C0001");
// 遍歷元素
foreach (DictionaryEntry entry in hashtable)
{
Console.WriteLine(entry.Value );
}
// 移除元素
hashtable.Remove("A");
// 定義非泛型隊(duì)列
Queue queues = new Queue();
// 添加元素
queues.Enqueue(1);
queues.Enqueue("A001");
queues.Enqueue(2);
queues.Enqueue("A002");
// 定義非泛型堆棧
Stack stacks = new Stack();
// 添加元素
stacks.Push("A");
stacks.Push(1);
stacks.Push(true);
// 輸出 true 時(shí)會(huì)報(bào)異常 無(wú)法將類(lèi)型為“System.Boolean”的對(duì)象強(qiáng)制轉(zhuǎn)換為類(lèi)型“System.String”
foreach (string stack in stacks)
{
Console.Write(stack);
}
// 定義非泛型排序列表
SortedList sortedLists = new SortedList();
// 添加元素
nsortedLists.Add("001", "Haiwei");
nsortedLists.Add("002", "Xiaomi");
// 判斷元素
if (sortedLists.ContainsValue("Haiwei"))
{
Console.WriteLine("值已存在");
}
else
{
sortedLists.Add("003", "Haiwei");
}
// 遍歷元素
foreach (string sortedList in sortedLists.Keys)
{
Console.WriteLine(sortedList);
}
小結(jié)
與非泛型集合相比,C# 中的泛型集合在類(lèi)型安全性、性能和易用性方面具有顯著優(yōu)勢(shì)。在大多數(shù)情況下,建議使用泛型集合為首選方案。
該文章在 2024/11/15 11:21:53 編輯過(guò)