前言
在 C# 中,集合可以分泛型集合和非泛型集合两种主要类型。两种集合类型在类型、安全性、可用性和性能特征等方面有所不同。而在大多数情况下,建议使用泛型集合,因为它执行速度比非泛型集合快,并且通过提供编译时错误来最大限度地减少异常。本文了解泛型和非泛型集合两种类型的概述。
泛型集合
1、概述
泛型集合类型可以用来储存任何类型的数据,由 Collections.Generic 命名空间提供。
HashSet<string> hashSet = new HashSet<string>();
List<int> numbers = new List<int>();
2、特征
提供强大的类型安全性,在声明元素时,允许指定包含的元素类型。类型的安全性在编译时强制执行,以防止与类型相关的运行时错误。
在从集合中检索元素时无需显式强制转换,对使用者更友好,在编码时,可以使用强类型元素,使代码更具可读性且不易出错。
避免装箱和取消装箱的开销,使得在执行速度和内存使用方面都更有效。为值类型提供了更好的性能,并且在检索元素时不需要强制转换。
3、示例
// 定义数字列表
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);
}
// 定义整数链表
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、特征
非泛型集合将元素存储为对象类型,并且在检索元素时通常需要显式强制转换,因此它不是类型安全的。与类型相关的错误只能在运行时发现。
在处理元素时涉及强制转换和装箱/取消装箱操作,由于强制转换会使代码的可读性降低且更容易出错,从而降低其可用性。
由于存在装箱和取消装箱,使得非泛型集合可能会产生性能开销,可能会导致性能下降,尤其在使用值类型。
3、示例
// 定义非泛型动态数组
ArrayList arrayLists = new ArrayList();
// 添加整数元素
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”的对象强制转换为类型“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);
}
小结
与非泛型集合相比,C# 中的泛型集合在类型安全性、性能和易用性方面具有显著优势。在大多数情况下,建议使用泛型集合为首选方案。
该文章在 2024/11/15 11:21:53 编辑过