前言
在 C# 中,集合可以分泛型集合和非泛型集合兩種主要類型。兩種集合類型在類型、安全性、可用性和性能特征等方面有所不同。而在大多數(shù)情況下,建議使用泛型集合,因為它執(zhí)行速度比非泛型集合快,并且通過提供編譯時錯誤來最大限度地減少異常。本文了解泛型和非泛型集合兩種類型的概述。
泛型集合
1、概述
泛型集合類型可以用來儲存任何類型的數(shù)據(jù),由 Collections.Generic 命名空間提供。
HashSet<string> hashSet = new HashSet<string>();
List<int> numbers = new List<int>();
2、特征
提供強大的類型安全性,在聲明元素時,允許指定包含的元素類型。類型的安全性在編譯時強制執(zhí)行,以防止與類型相關(guān)的運行時錯誤。
在從集合中檢索元素時無需顯式強制轉(zhuǎn)換,對使用者更友好,在編碼時,可以使用強類型元素,使代碼更具可讀性且不易出錯。
避免裝箱和取消裝箱的開銷,使得在執(zhí)行速度和內(nèi)存使用方面都更有效。為值類型提供了更好的性能,并且在檢索元素時不需要強制轉(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]);
}
// 定義客戶對象列表
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"]);
// 定義字符串隊列
Queue<string> queues = new Queue<string>();
// 添加元素
queues.Enqueue("A001");
queues.Enqueue("A002");
// 遍歷元素
foreach (string queue in queues)
{
Console.WriteLine(queue);
}
// 定義字符串無序集
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、概述
非泛型集合主要用于存儲多種類型的對象,具有較高的靈活性,但性能和類型安全性較差。由 System.Collections 命名空間提供。
ArrayList list = new ArrayList();
Hashtable hashtable = new Hashtable();
2、特征
非泛型集合將元素存儲為對象類型,并且在檢索元素時通常需要顯式強制轉(zhuǎn)換,因此它不是類型安全的。與類型相關(guān)的錯誤只能在運行時發(fā)現(xiàn)。
在處理元素時涉及強制轉(zhuǎn)換和裝箱/取消裝箱操作,由于強制轉(zhuǎn)換會使代碼的可讀性降低且更容易出錯,從而降低其可用性。
由于存在裝箱和取消裝箱,使得非泛型集合可能會產(chǎn)生性能開銷,可能會導(dǎo)致性能下降,尤其在使用值類型。
3、示例
// 定義非泛型動態(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");
// 定義非泛型隊列
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 時會報異常 無法將類型為“System.Boolean”的對象強制轉(zhuǎn)換為類型“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# 中的泛型集合在類型安全性、性能和易用性方面具有顯著優(yōu)勢。在大多數(shù)情況下,建議使用泛型集合為首選方案。
該文章在 2024/11/15 11:21:53 編輯過